Прошло 2 года.

This commit is contained in:
Кобелев Андрей Андреевич
2026-03-10 22:54:23 +03:00
parent c7636ebd6f
commit a111352dc5
313 changed files with 274971 additions and 1409 deletions

View File

@@ -1,10 +1,22 @@
PYTHON ?= python3.11
EPDIY_SCRIPTS := lib/epdiy/scripts
MARTIAN_FONT := static/MartianMono-VariableFont_wdth,wght.ttf
MARTIAN_CHARS := 0123456789:;.,-+/!@\#^&*%°CABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя
image:
python3 .pio/libdeps/esp32dev/epdiy/scripts/imgconvert.py -i static/sun.jpg -n sun -o include/sun.h \
&& python3 .pio/libdeps/esp32dev/epdiy/scripts/imgconvert.py -i static/moon.jpg -n moon -o include/moon.h
$(PYTHON) $(EPDIY_SCRIPTS)/imgconvert.py -i static/sun.jpg -n sun -o include/sun.h
$(PYTHON) $(EPDIY_SCRIPTS)/imgconvert.py -i static/moon.jpg -n moon -o include/moon.h
font_12:
python3 .pio/libdeps/esp32dev/epdiy/scripts/fontconvert.py --compress IBMPlexMono12 12 static/IBMPlexMono-SemiBold.ttf --string '0123456789:;.,-+/!@#^&*%°CАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя' > lib/IBMPlexMono/IBMPlexMono12.h
$(PYTHON) $(EPDIY_SCRIPTS)/fontconvert.py --compress MartianMono12 12 $(MARTIAN_FONT) --string '$(MARTIAN_CHARS)' > lib/MartianMono/MartianMono12.h
font_30:
python3 .pio/libdeps/esp32dev/epdiy/scripts/fontconvert.py --compress MartianMono30 30 static/MartianMono-VariableFont_wdth,wght.ttf --string 'АВДИМНОПСФЧЯабвгдеиклнопрстуцьюя' > lib/MartianMono/MartianMono30.h
$(PYTHON) $(EPDIY_SCRIPTS)/fontconvert.py --compress MartianMono30 30 $(MARTIAN_FONT) --string '$(MARTIAN_CHARS)' > lib/MartianMono/MartianMono30.h
font_120:
$(PYTHON) $(EPDIY_SCRIPTS)/fontconvert.py --compress MartianMono120 120 $(MARTIAN_FONT) --string '0123456789' > lib/MartianMono/MartianMono120.h
font_200:
python3 .pio/libdeps/esp32dev/epdiy/scripts/fontconvert.py --compress MartianMono200 200 static/MartianMono-VariableFont_wdth,wght.ttf --string '0123456789' > lib/MartianMono/MartianMono200.h
$(PYTHON) $(EPDIY_SCRIPTS)/fontconvert.py --compress MartianMono200 200 $(MARTIAN_FONT) --string '0123456789' > lib/MartianMono/MartianMono200.h
font_all: font_12 font_30 font_120 font_200

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,818 @@
#pragma once
#include "epdiy.h"
/*
Created with
lib/epdiy/scripts/fontconvert.py --compress MartianMono120 120 static/MartianMono-VariableFont_wdth,wght.ttf --string 0123456789
As 'MartianMono120' with available 11 characters
0123456789
*/
const uint8_t MartianMono120_Bitmaps[12384] = {
0x78, 0x9C, 0x03, 0x00, 0x00, 0x00, 0x00, 0x01, 0x78, 0x9C, 0xAD, 0x5B, 0x4B, 0x88, 0x5C, 0x45,
0x14, 0x7D, 0x63, 0x92, 0x76, 0xC6, 0x99, 0x4C, 0x37, 0xD9, 0x04, 0x23, 0x98, 0x71, 0xEB, 0x87,
0x19, 0xC1, 0x80, 0x28, 0x21, 0xEE, 0xDC, 0xA5, 0x83, 0xB8, 0x11, 0x25, 0xA3, 0x90, 0x85, 0xBB,
0x16, 0x57, 0x82, 0x8B, 0x64, 0xE3, 0xD6, 0xB8, 0x8B, 0x8B, 0x90, 0x51, 0x84, 0x6C, 0x24, 0x44,
0xDD, 0x08, 0x6E, 0x46, 0xDC, 0xCB, 0x88, 0xA2, 0x20, 0x0A, 0xAD, 0xE2, 0x6F, 0x95, 0x8E, 0xC6,
0xFF, 0xAF, 0x9C, 0xF7, 0x5E, 0xF7, 0x74, 0xDD, 0x73, 0x3F, 0x55, 0xF5, 0x72, 0xCF, 0x2E, 0x79,
0xD5, 0x67, 0xDE, 0xAB, 0xBA, 0x75, 0xCE, 0xAD, 0xAA, 0x5B, 0x55, 0x65, 0x63, 0xED, 0xCC, 0x85,
0xF7, 0xBE, 0xBC, 0x16, 0x42, 0xB8, 0xF6, 0xE1, 0x9B, 0x2F, 0x1C, 0x5B, 0x48, 0xB4, 0x4E, 0x70,
0xBD, 0xF4, 0x45, 0xA0, 0xB8, 0xF8, 0x68, 0x67, 0xB2, 0x8D, 0x77, 0xFF, 0x0B, 0x1C, 0xE3, 0x27,
0x3A, 0xBD, 0xE2, 0xE0, 0xB2, 0x44, 0x56, 0x63, 0xE7, 0xC1, 0x72, 0xB6, 0x67, 0xFE, 0x56, 0xC8,
0x6A, 0xBC, 0xBC, 0xAF, 0x90, 0xED, 0x0D, 0x83, 0xAC, 0xFE, 0xE2, 0xC3, 0x45, 0x6C, 0x9F, 0xD9,
0x6C, 0xBB, 0xB8, 0xBB, 0x80, 0xED, 0x87, 0x24, 0x5B, 0x08, 0x0F, 0xBB, 0xB2, 0x85, 0x70, 0x4F,
0x26, 0xDB, 0xA7, 0x59, 0x6C, 0x21, 0xDC, 0x9E, 0xC5, 0xF6, 0x41, 0x26, 0x5B, 0x08, 0xBD, 0x0C,
0xB6, 0xE7, 0xB2, 0xD9, 0xC2, 0xCE, 0x2D, 0x49, 0xB6, 0xB5, 0x7F, 0xF2, 0xE9, 0xC2, 0xD9, 0x24,
0xDD, 0xAF, 0x05, 0x6C, 0x21, 0xDC, 0x91, 0x60, 0x7B, 0xA5, 0x88, 0x2D, 0x4C, 0xEC, 0xE9, 0x31,
0x28, 0xF9, 0xD4, 0x1A, 0x9B, 0x26, 0xDD, 0xC7, 0x85, 0x6C, 0x21, 0x2C, 0x1A, 0x6C, 0x1B, 0x9A,
0x88, 0xE8, 0xB8, 0x6A, 0xD0, 0xFD, 0x52, 0xCC, 0x16, 0xC2, 0x6D, 0x2A, 0xDB, 0x23, 0x1D, 0xD8,
0xC2, 0xB6, 0xEB, 0xCB, 0x85, 0xB0, 0xAC, 0xF5, 0x5C, 0x27, 0x36, 0xB5, 0xF7, 0xBE, 0xE9, 0x46,
0xA7, 0x0D, 0xEE, 0xBF, 0x1D, 0xE9, 0x46, 0x22, 0xDB, 0x5B, 0x1D, 0xD9, 0x42, 0x10, 0xA7, 0xC6,
0x1F, 0x9D, 0xE9, 0xEE, 0x14, 0xD8, 0x3A, 0x45, 0x49, 0x8B, 0x1D, 0x81, 0xEE, 0x6B, 0xAD, 0xF1,
0x95, 0x67, 0x1F, 0x38, 0xB4, 0x3B, 0x9B, 0xEF, 0x7F, 0xFC, 0x82, 0x3A, 0xA1, 0x85, 0xC1, 0x50,
0x7C, 0xF5, 0xC5, 0xB8, 0x63, 0x1E, 0xFB, 0x5C, 0x6E, 0x74, 0x82, 0xB1, 0x3D, 0x2D, 0xB6, 0xDB,
0xDA, 0x0F, 0xCD, 0x9E, 0x17, 0xDF, 0x70, 0xC2, 0xE8, 0x7E, 0x92, 0x9A, 0x3D, 0xC5, 0x3F, 0x62,
0xED, 0x47, 0xA9, 0xE1, 0x52, 0xCE, 0xB7, 0x3E, 0x24, 0x74, 0x71, 0x55, 0x7D, 0x9F, 0xF1, 0xB5,
0xA7, 0x84, 0x36, 0x9A, 0x31, 0x0B, 0x36, 0x3C, 0x86, 0x26, 0x5F, 0xF1, 0x26, 0xA7, 0x15, 0xB6,
0x6A, 0xF0, 0x17, 0x6F, 0x7C, 0x2B, 0x6D, 0xC2, 0x63, 0x78, 0x4B, 0x63, 0xDB, 0x0D, 0x51, 0xAE,
0xB2, 0x34, 0x92, 0x07, 0xFC, 0xEF, 0x1D, 0xD0, 0xE9, 0xAA, 0xB7, 0x59, 0xEB, 0xF3, 0xE4, 0x39,
0x37, 0xB0, 0xFB, 0x0C, 0x36, 0xE9, 0x63, 0x88, 0x83, 0xFF, 0x8C, 0x4F, 0x77, 0xEC, 0x8C, 0x95,
0x47, 0x29, 0xD1, 0xF8, 0x3F, 0xF1, 0xE9, 0x8A, 0xC9, 0x26, 0xB8, 0xFB, 0x7A, 0xF4, 0x70, 0x8D,
0xBD, 0x5C, 0x82, 0x8D, 0x07, 0x56, 0x3C, 0x72, 0xAC, 0xEB, 0x0E, 0xA6, 0xE8, 0xAA, 0xDF, 0xF0,
0x27, 0x51, 0xEF, 0xE0, 0x0C, 0x9B, 0xA4, 0x73, 0x7D, 0x96, 0x68, 0x45, 0xAA, 0xF2, 0x3B, 0x3C,
0xE2, 0x0A, 0xC1, 0x81, 0xB3, 0x72, 0x75, 0xFE, 0x08, 0xC3, 0x32, 0x27, 0x0F, 0xFC, 0x08, 0x7E,
0x33, 0x77, 0x0C, 0xEC, 0x57, 0xDD, 0x89, 0x23, 0xA0, 0x8D, 0xCE, 0xA7, 0x2D, 0x9A, 0x8E, 0xA4,
0xFD, 0x1C, 0x18, 0xCA, 0x7B, 0x3A, 0x8B, 0x41, 0x6C, 0xCD, 0x2F, 0xFD, 0x6B, 0xF7, 0x34, 0x0F,
0x46, 0x22, 0x19, 0x74, 0x2D, 0xD0, 0xAB, 0xFA, 0xB3, 0x07, 0xE0, 0xD7, 0xEB, 0x16, 0x49, 0x04,
0xD0, 0xA9, 0x59, 0xE6, 0x88, 0x9D, 0xAA, 0xA7, 0x58, 0x14, 0xD0, 0x47, 0xB3, 0x01, 0xC4, 0x39,
0x91, 0xBB, 0x5E, 0x55, 0x7E, 0x07, 0x4A, 0x6C, 0xE8, 0x26, 0x05, 0x8A, 0xE4, 0x34, 0x5A, 0x6F,
0x74, 0xEB, 0x3A, 0xD6, 0x79, 0xD3, 0x44, 0x0F, 0x02, 0x28, 0xB7, 0xEB, 0x58, 0xE7, 0x4D, 0x87,
0x16, 0x06, 0x36, 0x7F, 0x25, 0xFD, 0x3E, 0xFD, 0x61, 0x3B, 0xB4, 0xD0, 0x05, 0xE8, 0x71, 0x06,
0x60, 0x72, 0xB6, 0x9D, 0x0E, 0x42, 0x2D, 0x27, 0x7F, 0x32, 0xA8, 0x74, 0xB4, 0xA9, 0xC5, 0x6B,
0x94, 0xEE, 0x68, 0x01, 0x1D, 0x78, 0x42, 0x63, 0x3F, 0x10, 0x27, 0x5A, 0x22, 0x2E, 0x01, 0x52,
0xFD, 0xC6, 0xBB, 0x21, 0x4E, 0xF2, 0xE6, 0x7F, 0x83, 0x53, 0xA0, 0x93, 0xCD, 0x9B, 0x80, 0xEA,
0xE7, 0xB3, 0xB1, 0xE4, 0xA2, 0x11, 0x64, 0xFA, 0x9F, 0x59, 0xD2, 0xD9, 0xE2, 0x5B, 0x60, 0x6B,
0x27, 0x00, 0x7D, 0xE3, 0xFC, 0x81, 0xE5, 0x99, 0x43, 0xFD, 0x5B, 0xF0, 0xD8, 0xEC, 0x81, 0x15,
0xF2, 0x9E, 0x7A, 0xFD, 0x03, 0xB1, 0x98, 0x76, 0xD8, 0x29, 0x58, 0xE2, 0xD0, 0xCE, 0x80, 0x73,
0xF4, 0xBF, 0x58, 0x5A, 0xAA, 0xE0, 0x13, 0xCE, 0xD6, 0x0C, 0x23, 0xF8, 0x4E, 0x66, 0x9C, 0x9C,
0x93, 0xD8, 0xEA, 0xE9, 0x0E, 0x51, 0x9C, 0xA7, 0x9D, 0x1B, 0xF2, 0xFA, 0xAD, 0x87, 0x09, 0x45,
0xA6, 0x00, 0x28, 0x0B, 0xAE, 0x25, 0x9C, 0x28, 0xD6, 0xD2, 0x7E, 0x0E, 0xB1, 0xE3, 0x42, 0x93,
0xC6, 0x51, 0x57, 0xCC, 0x0A, 0x3B, 0x75, 0x5F, 0xA9, 0x8F, 0x03, 0x9E, 0x93, 0xEC, 0xE8, 0xFB,
0x4A, 0xBB, 0x41, 0x4B, 0x9F, 0xF5, 0xD3, 0x6C, 0x2C, 0xDF, 0x9A, 0x63, 0x88, 0x73, 0x2C, 0x23,
0x8A, 0x8D, 0x0D, 0xB9, 0x11, 0x4A, 0x7B, 0x5A, 0xED, 0xE4, 0xB5, 0x60, 0x8B, 0x2D, 0x4C, 0x01,
0xAC, 0x3D, 0xA0, 0xB6, 0xE3, 0xAC, 0x0D, 0xE0, 0x6D, 0x9C, 0xB2, 0xC9, 0x49, 0xC1, 0x72, 0xE2,
0x18, 0x63, 0x1C, 0xF4, 0x94, 0x2B, 0xF2, 0xF5, 0x0E, 0x01, 0xAA, 0x56, 0x62, 0x8E, 0xA1, 0x9C,
0x23, 0x16, 0x40, 0x01, 0x6C, 0xB6, 0x81, 0xD5, 0x71, 0xCD, 0xC7, 0xD1, 0x1C, 0x32, 0x31, 0x65,
0xBF, 0x4B, 0xB0, 0x85, 0x03, 0x54, 0x50, 0x6C, 0xA7, 0x78, 0x3D, 0xC5, 0x16, 0x7A, 0xD7, 0xC9,
0x3F, 0xCD, 0x64, 0x4C, 0x90, 0x73, 0xC4, 0x22, 0xD5, 0x27, 0x73, 0xE7, 0x56, 0x90, 0x73, 0xC4,
0x12, 0x35, 0x6D, 0x4B, 0x50, 0x98, 0x0F, 0x0A, 0x58, 0xA6, 0x72, 0x37, 0xD4, 0xD9, 0xB2, 0xB6,
0x80, 0x57, 0xE8, 0xC2, 0x54, 0xD7, 0x27, 0x45, 0xCE, 0x4F, 0xD3, 0xD0, 0x39, 0x48, 0x27, 0x8D,
0xEE, 0xB2, 0xB2, 0x9C, 0x6F, 0x2F, 0xD0, 0x1C, 0x62, 0x95, 0x8A, 0x97, 0x2A, 0x77, 0x8A, 0x9C,
0xF7, 0xE0, 0xCF, 0xF4, 0xE9, 0x70, 0x69, 0x74, 0xB2, 0x0F, 0xD6, 0x5B, 0xEE, 0xF0, 0x3A, 0xF0,
0xB2, 0x45, 0x1D, 0x57, 0xC7, 0x01, 0x74, 0x16, 0x74, 0xA5, 0x4C, 0x27, 0xCB, 0x79, 0x73, 0x5C,
0x41, 0x87, 0x72, 0x9D, 0xD2, 0xC9, 0x1B, 0x14, 0x8A, 0x9C, 0x37, 0xC9, 0x26, 0x0D, 0xB4, 0x13,
0xD4, 0x79, 0x44, 0x6D, 0x57, 0x7C, 0xF0, 0xDE, 0xE6, 0x21, 0x9D, 0x06, 0xC3, 0x34, 0x9D, 0xE2,
0x83, 0xD3, 0xF9, 0x08, 0x74, 0xB4, 0x93, 0xA5, 0x15, 0x8F, 0x2C, 0xE7, 0xE3, 0xE9, 0x2E, 0x11,
0x5D, 0xF9, 0x6C, 0x52, 0x95, 0x10, 0xE8, 0xDE, 0x91, 0x3F, 0x75, 0xE6, 0x51, 0x94, 0x6E, 0x44,
0xE9, 0x78, 0x76, 0xA7, 0xF8, 0xE0, 0xF1, 0xD9, 0x73, 0xAA, 0x48, 0x23, 0xDA, 0x8A, 0xD1, 0x29,
0x72, 0x3E, 0xDF, 0x5F, 0x33, 0xE9, 0x98, 0xCD, 0xCA, 0x72, 0x3E, 0x9E, 0x1B, 0x1E, 0x95, 0xDF,
0xB3, 0x36, 0x9D, 0xE2, 0x83, 0xD1, 0x47, 0x94, 0xD0, 0x29, 0x3E, 0x78, 0xB2, 0xEA, 0x44, 0x27,
0xED, 0x99, 0x06, 0x30, 0x94, 0x02, 0x3A, 0x59, 0xCE, 0x27, 0xFB, 0xBB, 0xD1, 0xC1, 0xCA, 0x74,
0x86, 0x23, 0x55, 0x27, 0x3A, 0xC5, 0x07, 0x61, 0x3B, 0x39, 0x9B, 0x4E, 0xF6, 0xC1, 0xAB, 0x0B,
0xDD, 0xE8, 0x64, 0x39, 0x9F, 0x60, 0xC6, 0x96, 0x49, 0xA7, 0xCB, 0x79, 0x01, 0xDD, 0x5E, 0x7C,
0x1A, 0x72, 0x4E, 0x01, 0x93, 0x4C, 0x91, 0x00, 0xCD, 0x07, 0xCB, 0xE8, 0x66, 0x02, 0xA5, 0xFA,
0x20, 0x03, 0x08, 0x94, 0x28, 0x9F, 0xA6, 0x9C, 0x5B, 0x74, 0x9B, 0x92, 0xB8, 0xDB, 0x72, 0x4E,
0x91, 0xE1, 0x15, 0x86, 0x0F, 0xA6, 0xE8, 0x04, 0x63, 0xB4, 0x7C, 0x90, 0x01, 0x8C, 0x91, 0xDB,
0xB6, 0x22, 0xE7, 0xCA, 0x01, 0x06, 0xD8, 0x36, 0x4B, 0x2A, 0x94, 0x8E, 0x3B, 0x2F, 0xB3, 0x61,
0x52, 0xC1, 0x52, 0x1E, 0xC5, 0x07, 0xB5, 0xF5, 0x0B, 0xA4, 0x3C, 0x98, 0x90, 0x29, 0x72, 0xAE,
0xAE, 0xD5, 0x20, 0x21, 0x83, 0x97, 0x55, 0xE4, 0xFC, 0xB8, 0xC6, 0x06, 0x5B, 0x4E, 0xAB, 0xB4,
0x2B, 0x87, 0xB2, 0x0F, 0x1A, 0xEB, 0x03, 0x18, 0xCA, 0x9C, 0xD3, 0xF6, 0x09, 0x1E, 0x5C, 0x46,
0xA0, 0x03, 0xB7, 0x72, 0x43, 0xA1, 0x88, 0x61, 0xED, 0xFC, 0xD0, 0xCE, 0x59, 0x16, 0x4F, 0x3E,
0x29, 0x4E, 0x1A, 0x6C, 0x15, 0xFC, 0xE1, 0xEB, 0x32, 0x45, 0x04, 0x94, 0x73, 0x02, 0x58, 0xFB,
0x2F, 0x0A, 0x67, 0x95, 0x14, 0x4C, 0xCE, 0x09, 0x60, 0xED, 0xDF, 0xC3, 0x43, 0x0C, 0x86, 0x23,
0x16, 0x1B, 0x5B, 0xFB, 0xA7, 0xAA, 0x01, 0xD4, 0x63, 0xD5, 0x16, 0xB8, 0xF6, 0x4F, 0x2C, 0xB5,
0x04, 0x39, 0x27, 0xC0, 0xB5, 0x7F, 0xA2, 0x4E, 0x29, 0x75, 0xC4, 0x85, 0x6B, 0x7F, 0xE9, 0x14,
0x7A, 0x8E, 0x54, 0x25, 0x51, 0x85, 0x6B, 0x7F, 0xB3, 0x6A, 0x24, 0xBD, 0x5F, 0x46, 0xE3, 0x6C,
0x5B, 0x3A, 0x37, 0xDE, 0x43, 0x46, 0x15, 0x16, 0x9D, 0x54, 0x5B, 0x18, 0xD6, 0x04, 0xB2, 0x9C,
0x13, 0x50, 0x05, 0x19, 0xE1, 0x1C, 0x8E, 0x21, 0xF9, 0x20, 0x82, 0xCA, 0xDD, 0xD0, 0xD8, 0x30,
0x48, 0x17, 0x88, 0x55, 0xA8, 0x4F, 0x47, 0xF5, 0xCD, 0xBD, 0x8C, 0x8E, 0xAB, 0x50, 0x50, 0xFA,
0x7A, 0x79, 0x51, 0x72, 0xEB, 0xAD, 0x06, 0xEC, 0xB0, 0xAF, 0x28, 0xB5, 0x19, 0x96, 0x9C, 0xC7,
0x80, 0xA8, 0x5D, 0x12, 0xCB, 0x1F, 0x82, 0xEE, 0x83, 0x00, 0x98, 0x63, 0x3D, 0xA5, 0x22, 0x48,
0xF5, 0x41, 0x00, 0xE8, 0xD1, 0x3E, 0x25, 0xCD, 0xCC, 0xDD, 0xC8, 0x87, 0x9E, 0xE2, 0x9F, 0xDF,
0xC0, 0x94, 0xF3, 0x18, 0x34, 0x8A, 0xEB, 0xED, 0x3A, 0x56, 0x62, 0x50, 0x70, 0x68, 0x09, 0x2E,
0xDB, 0xEC, 0xB0, 0x33, 0xA3, 0xB6, 0x7C, 0x10, 0x20, 0x1C, 0xEC, 0xB0, 0x85, 0x97, 0x2D, 0xE7,
0x31, 0x40, 0x8E, 0x9A, 0xA3, 0x23, 0xCC, 0x71, 0x12, 0x72, 0x1E, 0x03, 0x86, 0xB1, 0xD9, 0xD4,
0x01, 0xE3, 0x36, 0x7D, 0x10, 0x00, 0x71, 0xD2, 0xE4, 0xAE, 0x10, 0xC7, 0x39, 0x9B, 0xF8, 0x33,
0xC0, 0x9B, 0x34, 0x82, 0xE6, 0x7C, 0x64, 0xE9, 0x7C, 0xA0, 0xEA, 0x7C, 0xDC, 0xEB, 0x7C, 0x18,
0xED, 0x7D, 0x54, 0xEE, 0x7C, 0x90, 0xEF, 0x5C, 0x66, 0xE0, 0x5C, 0x04, 0xE1, 0x5C, 0xA2, 0xE1,
0x5C, 0x40, 0xE2, 0x5D, 0xDE, 0xE2, 0x5C, 0x7C, 0x03, 0xE1, 0x78, 0xB3, 0xA5, 0x41, 0xCE, 0x85,
0x4B, 0xCE, 0x65, 0x55, 0xDE, 0x45, 0x5F, 0xCE, 0x25, 0x69, 0xCE, 0x05, 0x73, 0xE5, 0xE5, 0x7C,
0xAC, 0xFE, 0x97, 0xCC, 0x74, 0x66, 0x8E, 0x37, 0x55, 0x6C, 0xE8, 0x5D, 0x0A, 0xE9, 0x5C, 0xA8,
0xE9, 0x5C, 0x46, 0xEA, 0x5C, 0xE4, 0xEA, 0x5D, 0x82, 0xEB, 0x5C, 0x20, 0xEC, 0x5C, 0xBE, 0xCC,
0x43, 0xA5, 0xC6, 0x93, 0x9C, 0x2C, 0xB3, 0xB8, 0x5A, 0x5E, 0xD7, 0x5E, 0xEA, 0x5A, 0xFA, 0xED,
0x5C, 0x98, 0x9E, 0x2A, 0x9B, 0xAF, 0xEE, 0x2A, 0x2B, 0x9B, 0x77, 0x2E, 0xEA, 0x77, 0xBE, 0x72,
0xE0, 0x7D, 0x21, 0xC2, 0xF9, 0xBA, 0x86, 0xF7, 0x65, 0x12, 0xE7, 0xAB, 0x2E, 0xCE, 0x17, 0x71,
0xBC, 0xAF, 0x09, 0x39, 0x5F, 0x62, 0xF2, 0xBE, 0x62, 0xE5, 0x7C, 0x01, 0xAC, 0xFC, 0x7A, 0x5A,
0x62, 0x51, 0xE3, 0x7B, 0x79, 0xCE, 0xFB, 0x6A, 0x9F, 0xF7, 0xC5, 0x43, 0xE7, 0x6B, 0x91, 0x25,
0x97, 0x36, 0x33, 0x36, 0xE4, 0x2A, 0xEF, 0x2B, 0xA5, 0xDE, 0x17, 0x5E, 0xBD, 0xAF, 0xE3, 0x7A,
0x5F, 0x16, 0xF6, 0xBE, 0xCA, 0x9C, 0xB8, 0x68, 0x7D, 0xA9, 0xF4, 0xA2, 0x75, 0x7D, 0x0D, 0x5C,
0x7D, 0xB5, 0x0E, 0xD7, 0xC0, 0x2B, 0xE7, 0x4B, 0xEA, 0x35, 0x5C, 0xAF, 0xD0, 0xB7, 0x8C, 0x67,
0x5E, 0x2D, 0xB9, 0xE0, 0xFF, 0x3F, 0x7F, 0x2A, 0x56, 0x07, 0x78, 0x9C, 0xED, 0xD3, 0xBD, 0x4D,
0x03, 0x41, 0x10, 0x05, 0xE0, 0x3D, 0x0C, 0xC6, 0x99, 0x9D, 0xDA, 0x4E, 0x28, 0xC0, 0x81, 0x1B,
0x40, 0x72, 0x03, 0x96, 0xA8, 0xC0, 0x2D, 0x40, 0x07, 0xD0, 0xC1, 0x41, 0x05, 0x2E, 0x01, 0x41,
0x03, 0x96, 0xA0, 0x00, 0x07, 0x24, 0x64, 0x8E, 0x20, 0x75, 0x88, 0xF9, 0x31, 0x90, 0x02, 0x37,
0x33, 0xF7, 0xDE, 0xFA, 0x12, 0xA4, 0x37, 0xE9, 0xDB, 0xFB, 0x76, 0xF5, 0x4E, 0x93, 0x92, 0x35,
0x37, 0x5F, 0xD6, 0x74, 0xCD, 0xB3, 0xC1, 0x9C, 0x99, 0x0C, 0xED, 0x8C, 0x3F, 0x9A, 0x71, 0x5E,
0x6D, 0x86, 0x75, 0x9E, 0x1C, 0x86, 0x74, 0x6E, 0x3D, 0x86, 0x73, 0x9C, 0x8E, 0x59, 0x67, 0xBC,
0x6D, 0xC4, 0xE9, 0x79, 0x1D, 0x93, 0x8E, 0xDB, 0x31, 0xE7, 0xDC, 0x45, 0x0C, 0xEE, 0x5C, 0x84,
0x0C, 0xEC, 0x4C, 0x82, 0x8E, 0x09, 0xA7, 0xF7, 0x16, 0x33, 0xA8, 0xF3, 0x5C, 0xC3, 0x80, 0x4E,
0xDC, 0x31, 0xEC, 0xD4, 0x74, 0x8C, 0x3A, 0x93, 0xCF, 0x46, 0x9C, 0xDA, 0x8E, 0x41, 0xE7, 0x05,
0x60, 0x00, 0xE7, 0xDE, 0xFE, 0x70, 0xBD, 0xE5, 0x9C, 0x4B, 0xE7, 0x01, 0x83, 0x0D, 0xE5, 0x9C,
0x38, 0x1D, 0x4F, 0x13, 0xE5, 0x1C, 0xBD, 0xDB, 0x4C, 0x99, 0x38, 0xC7, 0xE9, 0x78, 0xD9, 0xE2,
0x9C, 0x07, 0xA7, 0x9C, 0xC3, 0x44, 0x39, 0x57, 0x0E, 0x33, 0x4C, 0x94, 0xE3, 0x75, 0x3C, 0x4B,
0x9C, 0xE3, 0x94, 0x73, 0x5D, 0x90, 0xCE, 0xC6, 0x64, 0x56, 0xFB, 0x56, 0xCA, 0x3B, 0x1D, 0x33,
0xA5, 0x9D, 0x91, 0x9D, 0xB2, 0xCE, 0xB9, 0x93, 0x92, 0xCE, 0xA2, 0x68, 0xC4, 0x59, 0x1F, 0x78,
0x29, 0xE7, 0xF4, 0xDD, 0x94, 0x72, 0xA6, 0x7E, 0xCA, 0x38, 0x65, 0x90, 0x12, 0xCE, 0x72, 0xAF,
0x19, 0xA7, 0x1D, 0xA5, 0xB8, 0x33, 0x0C, 0x53, 0xD8, 0x99, 0xC5, 0xB7, 0xA0, 0xCE, 0xBC, 0x88,
0x52, 0xD8, 0x59, 0xB5, 0xE2, 0xD7, 0xA2, 0x4E, 0x27, 0x4C, 0x61, 0x67, 0x14, 0xA6, 0xB0, 0x73,
0x5A, 0xF3, 0x5A, 0xD0, 0x59, 0x54, 0x3A, 0xCE, 0x72, 0x7E, 0x2E, 0xF9, 0x2E, 0x4E, 0x3F, 0x4C,
0x61, 0xE7, 0x38, 0xBE, 0x05, 0x75, 0xCA, 0x30, 0x85, 0x9D, 0x3F, 0x4B, 0x9E, 0xED, 0xB4, 0xC3,
0x14, 0x76, 0x06, 0xF1, 0x2D, 0xA8, 0x53, 0x59, 0xF2, 0x3C, 0x67, 0x1E, 0x84, 0x84, 0xF3, 0x58,
0x5D, 0xF2, 0x2C, 0xC7, 0xFD, 0x55, 0xA4, 0x13, 0x8F, 0x1C, 0x39, 0x72, 0xE4, 0xC8, 0x91, 0x23,
0x47, 0x8E, 0x1C, 0x39, 0x72, 0xE4, 0xC8, 0x91, 0x23, 0x47, 0x8E, 0x1C, 0x39, 0x72, 0xE4, 0xC8,
0x91, 0x23, 0x47, 0x8E, 0x1C, 0x39, 0x72, 0xE4, 0xC8, 0x91, 0x23, 0xE7, 0x3F, 0x3A, 0xBF, 0x4F,
0x66, 0x4F, 0x57, 0x8E, 0x1C, 0x39, 0x72, 0xE4, 0xC8, 0x91, 0xB3, 0xBB, 0xF3, 0x0D, 0x9B, 0x20,
0x43, 0xC7, 0x78, 0x9C, 0xED, 0x9A, 0x3B, 0x6C, 0x13, 0x41, 0x10, 0x86, 0x2F, 0xEF, 0xA0, 0x04,
0xE2, 0x0A, 0x09, 0x90, 0xC0, 0x20, 0x41, 0x83, 0x44, 0x42, 0x03, 0x0D, 0x90, 0xD0, 0x50, 0x50,
0x10, 0x23, 0x51, 0x13, 0x7A, 0x24, 0x92, 0x06, 0x89, 0x0E, 0x6A, 0x1A, 0x10, 0x05, 0x14, 0x20,
0x05, 0x0A, 0x0A, 0x2A, 0x03, 0x0D, 0xA5, 0x01, 0x09, 0x51, 0x21, 0x8B, 0x77, 0x41, 0x61, 0x90,
0x80, 0x06, 0x29, 0xE6, 0x15, 0x9E, 0x21, 0xCB, 0xD9, 0x97, 0xC4, 0xB7, 0xF3, 0xD8, 0x9D, 0x19,
0x19, 0x89, 0xC2, 0x7F, 0xE7, 0xF3, 0xFA, 0xF3, 0xDD, 0xEC, 0xCC, 0xCE, 0xEC, 0xCE, 0x25, 0x49,
0x48, 0x3B, 0x4F, 0xDE, 0x78, 0x35, 0xB7, 0xE8, 0xEA, 0x73, 0x8F, 0x2E, 0x9F, 0xDA, 0x1A, 0x1C,
0x19, 0xD0, 0xD8, 0xC5, 0x05, 0x97, 0x57, 0xFD, 0xCA, 0x36, 0x0B, 0xE5, 0x8E, 0xC3, 0xAA, 0xEE,
0xD6, 0x62, 0xAE, 0x13, 0x94, 0x86, 0x2A, 0x6B, 0x35, 0x94, 0xD2, 0x6F, 0x06, 0x93, 0xEA, 0xB8,
0x1C, 0x73, 0x61, 0x91, 0xC7, 0x38, 0x37, 0xDB, 0x23, 0xC4, 0x3C, 0x08, 0x51, 0x52, 0xD5, 0xFA,
0x44, 0x98, 0x17, 0x11, 0x4C, 0x0A, 0xEA, 0x17, 0x60, 0xDE, 0x47, 0x31, 0xA9, 0x0B, 0xC4, 0x41,
0xCF, 0x05, 0x98, 0xD4, 0x01, 0x7A, 0x23, 0x98, 0xFB, 0x22, 0x8C, 0x73, 0xE5, 0xAE, 0x20, 0xE6,
0x8C, 0x10, 0xE3, 0xDC, 0x89, 0x10, 0x66, 0x22, 0x38, 0xE1, 0xBE, 0x36, 0x04, 0x38, 0x3F, 0xE4,
0x18, 0x57, 0xE7, 0x4D, 0xF4, 0x44, 0x81, 0x71, 0xEE, 0x1C, 0x87, 0x29, 0xA9, 0x30, 0xCE, 0x0D,
0xB5, 0xE1, 0xA9, 0x1A, 0xAA, 0xD1, 0x73, 0x76, 0x53, 0x89, 0x71, 0x6E, 0x07, 0x85, 0x29, 0x2C,
0xC4, 0x7F, 0x08, 0x54, 0xA7, 0x22, 0xF6, 0xB1, 0x1A, 0x43, 0xDE, 0x50, 0x51, 0xE1, 0x3A, 0xAD,
0x1B, 0xEA, 0x46, 0x9C, 0x37, 0x06, 0x8C, 0x73, 0x1B, 0x91, 0x75, 0xFE, 0x98, 0x38, 0xB5, 0x76,
0x58, 0xA7, 0x21, 0xE8, 0x43, 0x81, 0x05, 0x39, 0x28, 0xE0, 0xD4, 0xE7, 0x8D, 0x18, 0xE7, 0xFC,
0x28, 0xFB, 0x66, 0xE6, 0x78, 0x96, 0x1E, 0xE3, 0x46, 0xD5, 0xCE, 0x1E, 0xD8, 0xD2, 0x95, 0x14,
0x36, 0x1F, 0xB9, 0xF4, 0x81, 0x19, 0x51, 0x11, 0x4C, 0x7A, 0x65, 0x57, 0x6E, 0xCC, 0xFE, 0x87,
0xF4, 0xA0, 0x7C, 0xF2, 0xF8, 0x45, 0x8E, 0x38, 0x08, 0xE6, 0xE2, 0x30, 0x39, 0x2C, 0xF7, 0x60,
0xC7, 0xC8, 0x47, 0xC2, 0x19, 0xB8, 0xF0, 0x92, 0x18, 0x57, 0x6E, 0x7D, 0xFF, 0x89, 0xC2, 0x90,
0xC9, 0x8E, 0xCA, 0x26, 0xAD, 0x60, 0x25, 0xEE, 0xB7, 0xCE, 0xE4, 0x4C, 0x02, 0x34, 0xBC, 0xFC,
0x1D, 0xB5, 0x0E, 0xAE, 0xA2, 0x31, 0x49, 0xF2, 0x13, 0x0D, 0x9D, 0x5C, 0xFE, 0xEA, 0x35, 0xC6,
0xEC, 0xE3, 0x30, 0xC9, 0x18, 0x0A, 0xC4, 0x95, 0x18, 0xFB, 0x8E, 0x30, 0xD5, 0x40, 0x96, 0xBB,
0x87, 0x46, 0x2F, 0xB9, 0x74, 0x01, 0xAF, 0x3C, 0xEC, 0x53, 0x91, 0x4F, 0xB6, 0x14, 0xAB, 0x38,
0x87, 0x9E, 0x0E, 0x61, 0xF0, 0xF8, 0xF1, 0xEC, 0x3A, 0x9E, 0xF5, 0x81, 0x20, 0x07, 0xE5, 0x95,
0x32, 0x63, 0x9E, 0xF0, 0xED, 0x10, 0x8B, 0x43, 0x76, 0x19, 0x99, 0x27, 0x68, 0x9D, 0x86, 0x60,
0x66, 0x69, 0x56, 0x43, 0x28, 0x28, 0x2A, 0x31, 0x0C, 0x0A, 0xEB, 0xA6, 0x27, 0xDE, 0x85, 0x9C,
0xD5, 0x51, 0xCE, 0x04, 0xF8, 0xC5, 0xA6, 0xC6, 0xC5, 0xCF, 0x90, 0x83, 0x73, 0x09, 0x12, 0x98,
0xFA, 0xE9, 0xC6, 0x35, 0x68, 0xFD, 0xE9, 0x38, 0x06, 0x3E, 0x58, 0xD3, 0x12, 0xD0, 0xCC, 0x5C,
0x15, 0x91, 0x17, 0xB4, 0x69, 0x42, 0x2C, 0xA9, 0x82, 0xC7, 0x42, 0x7F, 0xDE, 0x8B, 0xBD, 0x93,
0xAD, 0x8E, 0x3C, 0x01, 0x9F, 0x1B, 0xC4, 0xD3, 0xB5, 0x46, 0xC4, 0x01, 0x31, 0x30, 0x84, 0xA3,
0x42, 0x52, 0xAA, 0x23, 0x97, 0x1E, 0x49, 0x92, 0x79, 0xFF, 0x0A, 0x4A, 0xD8, 0xB4, 0x80, 0x07,
0x8D, 0xD2, 0xAE, 0x20, 0x90, 0x6F, 0xE8, 0xA9, 0x24, 0x01, 0xCB, 0x9B, 0xCC, 0x3C, 0xF0, 0xEF,
0xD3, 0xC9, 0x01, 0xE6, 0x89, 0x2C, 0x19, 0x2B, 0xF2, 0xCD, 0x51, 0x46, 0xEE, 0x13, 0xDE, 0x36,
0xB4, 0xE4, 0x47, 0x53, 0x35, 0x99, 0xF1, 0x31, 0xE5, 0x38, 0x21, 0x13, 0xC8, 0x0D, 0x70, 0x02,
0x27, 0xE3, 0x84, 0x4C, 0xA0, 0x48, 0x86, 0x9F, 0xA5, 0x66, 0x86, 0xFF, 0xDF, 0x0D, 0xEE, 0x2F,
0xBA, 0x14, 0x2E, 0x0B, 0xD8, 0xA3, 0xE7, 0xA3, 0xFF, 0x39, 0xB6, 0xCD, 0x5B, 0x11, 0xC8, 0xC1,
0xBD, 0xBE, 0xDD, 0xEB, 0x52, 0x0C, 0x9C, 0xE7, 0xBE, 0x2F, 0xDE, 0x47, 0xF1, 0x74, 0x25, 0x45,
0x9F, 0xD3, 0xFF, 0xD5, 0xFB, 0x28, 0x8D, 0x8A, 0x34, 0x09, 0x03, 0x8E, 0x5F, 0x60, 0x8E, 0x5A,
0x39, 0x03, 0xFE, 0x82, 0x24, 0x9E, 0x76, 0x18, 0x4F, 0xD2, 0x70, 0xFA, 0xEF, 0x39, 0xD0, 0xCE,
0x56, 0x0E, 0x9C, 0x77, 0x2B, 0x07, 0xFA, 0xA1, 0x95, 0x03, 0xE3, 0xC2, 0xCA, 0x01, 0x19, 0x55,
0x94, 0x3C, 0x29, 0x81, 0x75, 0x43, 0xBA, 0x8C, 0x22, 0x81, 0xF4, 0x69, 0xC5, 0x24, 0xFE, 0x7A,
0x23, 0xCC, 0x7A, 0x84, 0xFC, 0xF5, 0x26, 0x5E, 0xC2, 0x71, 0xF2, 0xE3, 0x5B, 0x56, 0x5C, 0x50,
0xF2, 0xB7, 0x36, 0xF2, 0xF5, 0x06, 0xCA, 0xCF, 0xCB, 0xE3, 0x56, 0x0C, 0xA8, 0x13, 0x46, 0xAC,
0x1C, 0xE0, 0x3E, 0xC3, 0xF1, 0x5F, 0xD0, 0x02, 0xE9, 0x6A, 0xD0, 0xCA, 0x01, 0xFB, 0x7D, 0x73,
0x78, 0x81, 0x9D, 0x81, 0x15, 0x03, 0xCC, 0x5C, 0xB5, 0x72, 0x40, 0x74, 0xC5, 0x36, 0x48, 0xAC,
0xFC, 0xAC, 0xA7, 0x48, 0x57, 0x40, 0xC0, 0x3C, 0xD6, 0x69, 0x87, 0xDB, 0x02, 0x6B, 0xB6, 0x80,
0xFB, 0x2F, 0xEB, 0x6A, 0x08, 0x0E, 0xAF, 0xAC, 0xAB, 0x06, 0x7C, 0x2C, 0x71, 0x31, 0x08, 0x04,
0x77, 0x7E, 0xF1, 0x0D, 0x24, 0x2D, 0x78, 0x32, 0x61, 0x34, 0xF3, 0x55, 0x80, 0x91, 0x17, 0x71,
0xBE, 0xE0, 0x46, 0xD4, 0xE8, 0xCD, 0x68, 0x9F, 0xAE, 0x28, 0x9A, 0xF2, 0x9A, 0x87, 0x1C, 0x9B,
0x79, 0xD0, 0xA1, 0x93, 0xD1, 0x3C, 0xE8, 0x76, 0xA6, 0xDA, 0x73, 0x3B, 0xC6, 0x20, 0xC5, 0x67,
0x57, 0xA6, 0xE0, 0xC2, 0xE7, 0xB9, 0xB3, 0x16, 0x4C, 0x01, 0x1F, 0x2F, 0x9B, 0x82, 0x82, 0x68,
0xB8, 0x48, 0x9B, 0x7C, 0x79, 0x11, 0x07, 0x8D, 0xA6, 0x0A, 0x01, 0x9F, 0x41, 0x9A, 0x66, 0xEB,
0x29, 0xC6, 0x10, 0x8D, 0x87, 0xA8, 0x66, 0x30, 0xC6, 0xB2, 0x84, 0x15, 0xA9, 0xBE, 0x8D, 0x21,
0xB6, 0xA8, 0x6E, 0x94, 0x61, 0x65, 0x26, 0x8C, 0x63, 0xB1, 0x32, 0xD9, 0x98, 0x60, 0x1A, 0x60,
0x01, 0xD1, 0x0D, 0x48, 0xB2, 0xFF, 0x15, 0x52, 0x81, 0x6E, 0x04, 0xA8, 0x7D, 0xF9, 0x1D, 0x89,
0x51, 0x57, 0x97, 0xB7, 0x49, 0x8C, 0xFA, 0x76, 0x28, 0x07, 0x34, 0xDC, 0x0E, 0xE9, 0x80, 0x86,
0xDB, 0x61, 0xDA, 0xA1, 0xDA, 0xC9, 0x22, 0x1D, 0x50, 0xEF, 0x3B, 0x5C, 0x67, 0x4C, 0x72, 0x0C,
0x9B, 0x53, 0x89, 0x69, 0x63, 0xCA, 0x4F, 0x54, 0x9A, 0x62, 0x1C, 0x50, 0xBD, 0xD1, 0xE6, 0xFA,
0x74, 0x7C, 0xBF, 0x85, 0x14, 0xF7, 0x96, 0x41, 0xA8, 0xDF, 0x42, 0x88, 0x71, 0x40, 0xED, 0xBE,
0x04, 0xB7, 0x84, 0x96, 0x74, 0x48, 0x85, 0x61, 0xFB, 0xF1, 0x15, 0xDD, 0x53, 0x3D, 0xE3, 0x9E,
0x4A, 0x37, 0x57, 0xD7, 0x38, 0xCC, 0x76, 0x15, 0x86, 0x73, 0xC0, 0xF0, 0x8B, 0x1B, 0x48, 0x44,
0x45, 0x90, 0x29, 0xF2, 0x22, 0x09, 0x14, 0xE7, 0x80, 0x81, 0xB7, 0x36, 0x28, 0xB1, 0xAF, 0xB9,
0xE8, 0x3C, 0x87, 0x75, 0x40, 0x9D, 0x8D, 0x59, 0x07, 0x3C, 0xAA, 0xC2, 0x50, 0xF5, 0x49, 0x53,
0xCA, 0x1A, 0xEE, 0x2D, 0x83, 0xA9, 0xEA, 0x56, 0x64, 0xCE, 0x01, 0x05, 0x2F, 0x33, 0xE5, 0xC5,
0x3A, 0xE0, 0x7A, 0x15, 0xA6, 0xC8, 0x39, 0xE0, 0x5E, 0x15, 0x86, 0x28, 0xB4, 0x33, 0x29, 0x77,
0x47, 0x9C, 0x03, 0x2A, 0xC3, 0x81, 0x7B, 0xCF, 0xAA, 0xA6, 0x0B, 0x07, 0xD6, 0x01, 0x95, 0x07,
0x3C, 0x9C, 0x03, 0xEA, 0xC2, 0x81, 0x29, 0x73, 0xD4, 0xE1, 0xC0, 0x39, 0xA0, 0x32, 0x1C, 0xC8,
0xB7, 0x2F, 0x9C, 0x3A, 0x1C, 0xB8, 0x32, 0x47, 0x19, 0x0E, 0xAC, 0x03, 0xAE, 0xD3, 0x61, 0x98,
0x32, 0x47, 0x1B, 0x0E, 0x9C, 0x03, 0x2A, 0xC3, 0x61, 0x82, 0x71, 0x40, 0x65, 0x38, 0x70, 0x65,
0x8E, 0x32, 0x1C, 0x58, 0x07, 0x54, 0x6E, 0x8B, 0x6E, 0x31, 0x18, 0x65, 0x38, 0x70, 0x0E, 0xA8,
0x0C, 0x07, 0xCE, 0x01, 0xB5, 0x5B, 0x61, 0x74, 0xF2, 0x91, 0xA9, 0xAA, 0xDD, 0xC2, 0xD2, 0xE5,
0x92, 0x36, 0x1C, 0x38, 0x8E, 0x32, 0x1C, 0x38, 0xCE, 0x1E, 0x35, 0x86, 0xE4, 0x58, 0x1A, 0x09,
0x04, 0x47, 0x19, 0x0E, 0x1C, 0x47, 0x1B, 0x0E, 0x1C, 0xC7, 0x76, 0x02, 0x87, 0x38, 0xCA, 0x70,
0xE0, 0x38, 0xCA, 0x70, 0xE0, 0x38, 0xE6, 0xDE, 0x91, 0xCF, 0x51, 0x87, 0x03, 0xCD, 0xE1, 0xDE,
0xAB, 0xD3, 0x72, 0xF4, 0xE1, 0x40, 0x72, 0xCC, 0x8D, 0x2C, 0xC0, 0x31, 0x37, 0xB2, 0xFE, 0x11,
0xC7, 0xA6, 0xC1, 0x0E, 0xA7, 0xC3, 0xE9, 0x70, 0x3A, 0x9C, 0x0E, 0xA7, 0xC3, 0xE9, 0x70, 0xDA,
0xC1, 0xF9, 0x0B, 0xDF, 0x48, 0xDB, 0x44, 0x78, 0x9C, 0xD5, 0x9B, 0xDB, 0x8B, 0x1C, 0x45, 0x14,
0xC6, 0x7B, 0x27, 0xAE, 0xC6, 0x75, 0x93, 0x9D, 0xF8, 0xE0, 0x05, 0x25, 0x3B, 0x41, 0x05, 0x41,
0x61, 0x17, 0x21, 0x2A, 0xF8, 0xB0, 0x6A, 0xC0, 0xBB, 0x68, 0xFE, 0x00, 0x5D, 0x95, 0x05, 0x43,
0x5E, 0xBC, 0x20, 0x82, 0x60, 0xBC, 0x21, 0x8B, 0x22, 0xB8, 0xD1, 0x07, 0x09, 0x82, 0xAC, 0x2F,
0x09, 0x06, 0x09, 0xF1, 0xFA, 0x22, 0xC2, 0x46, 0x11, 0x44, 0x44, 0x26, 0x2F, 0x62, 0x94, 0xE0,
0x24, 0x2A, 0x22, 0xA2, 0x69, 0x63, 0x34, 0xC6, 0x5B, 0xCA, 0xEE, 0xB9, 0xEC, 0x76, 0x7D, 0xE7,
0x54, 0xD7, 0x57, 0x67, 0xF7, 0xC5, 0xEF, 0x6D, 0x66, 0xBA, 0x7F, 0xD3, 0x55, 0x75, 0xEA, 0x9C,
0x53, 0xA7, 0xAA, 0xB3, 0xAC, 0x56, 0xD7, 0xCE, 0xEE, 0xFE, 0xF4, 0xE7, 0x93, 0xCE, 0xE5, 0x5F,
0xBF, 0xFF, 0xF2, 0xBD, 0x17, 0xD6, 0x5F, 0x1B, 0x54, 0x73, 0xE6, 0x93, 0x02, 0x51, 0x55, 0xFE,
0xDC, 0xE5, 0xE9, 0x98, 0xD6, 0xAE, 0x7F, 0x9D, 0xA2, 0xF6, 0x0D, 0x89, 0x4F, 0xB3, 0xF3, 0xA4,
0x86, 0xE9, 0xA2, 0xAE, 0x48, 0xE0, 0xDC, 0xFD, 0x4F, 0x08, 0x53, 0xEA, 0xF9, 0x55, 0x2C, 0xE7,
0xDD, 0x3A, 0x4C, 0xA1, 0xCE, 0xD9, 0x5C, 0xB3, 0x7E, 0x88, 0x70, 0x0A, 0xDD, 0x44, 0x70, 0x26,
0xFF, 0x8A, 0x73, 0x9C, 0xBB, 0x23, 0xCE, 0xF9, 0x9B, 0xE1, 0xC4, 0x49, 0x2C, 0xC7, 0xB9, 0x5B,
0xEB, 0xFB, 0xE7, 0x4F, 0x96, 0xE3, 0xDC, 0x25, 0x75, 0xA0, 0xEF, 0x79, 0x8E, 0x73, 0xA7, 0x85,
0x39, 0x1F, 0xA6, 0x70, 0x5C, 0x27, 0x68, 0x4F, 0x77, 0x25, 0x71, 0x9C, 0x7B, 0x3C, 0xD4, 0x41,
0x74, 0x47, 0x0F, 0x74, 0x9E, 0x0E, 0xFA, 0x36, 0x95, 0xE3, 0x72, 0xB5, 0x71, 0xA9, 0x0D, 0x2B,
0x75, 0x9B, 0x06, 0x4A, 0x18, 0xF9, 0x25, 0x9D, 0x2A, 0x39, 0x6F, 0x58, 0x38, 0x5A, 0x7F, 0xD7,
0x7A, 0x8E, 0xB0, 0x84, 0x31, 0x7D, 0x60, 0xE3, 0xC8, 0x47, 0x32, 0x3E, 0x90, 0x73, 0xC3, 0x2B,
0xD1, 0x43, 0xA5, 0xA6, 0x7C, 0x10, 0xE5, 0x84, 0x54, 0xE5, 0x8D, 0x2A, 0xE7, 0x09, 0x33, 0xC7,
0xB9, 0xD1, 0x2A, 0xE8, 0xF7, 0x65, 0x80, 0xE6, 0x2B, 0x9C, 0xC9, 0x65, 0x70, 0xBC, 0xEE, 0xDE,
0x1F, 0xBC, 0xA8, 0xFD, 0xEC, 0x75, 0x17, 0xAC, 0xCB, 0x9A, 0x1B, 0x36, 0x3D, 0x8C, 0x61, 0x77,
0x49, 0xEB, 0xE3, 0x5D, 0xFD, 0xCA, 0x45, 0x95, 0xC7, 0x6E, 0x3E, 0x1D, 0x30, 0x91, 0xA5, 0xB6,
0xDD, 0xAE, 0x5F, 0xB0, 0x70, 0x16, 0x1A, 0xDB, 0x4E, 0xFD, 0xC2, 0x45, 0x1F, 0x70, 0x58, 0xFD,
0x79, 0xDB, 0x10, 0x72, 0x8A, 0xBF, 0x54, 0x1F, 0x6A, 0x71, 0xDC, 0xD4, 0x96, 0xDD, 0x22, 0x31,
0x59, 0x20, 0xEA, 0x4D, 0xF7, 0x7F, 0xBC, 0x5A, 0xE3, 0x5C, 0xA5, 0x72, 0x8A, 0x2C, 0x45, 0x71,
0xA3, 0x9D, 0x9A, 0x31, 0xBB, 0x33, 0xC0, 0x29, 0xFE, 0x56, 0x49, 0x77, 0xFA, 0x06, 0x70, 0x5C,
0xFE, 0x32, 0x17, 0xE4, 0xA8, 0xB3, 0xA0, 0xDF, 0x49, 0xD2, 0x40, 0x74, 0x5F, 0x3C, 0xD0, 0x77,
0xE2, 0xFA, 0xDE, 0xC4, 0xBD, 0x5F, 0xFE, 0x43, 0x20, 0x3A, 0xF4, 0xD5, 0x14, 0x43, 0xD7, 0xB3,
0xA4, 0x43, 0x49, 0x0D, 0x2B, 0x25, 0x7D, 0x4E, 0xF7, 0xEB, 0x3F, 0xC4, 0xD7, 0x8A, 0x47, 0xF7,
0x25, 0x6C, 0xA0, 0xDB, 0xDB, 0x62, 0x14, 0xA6, 0x63, 0x1C, 0xF9, 0x48, 0x23, 0x99, 0x66, 0x45,
0xC3, 0x51, 0x90, 0x70, 0xCC, 0x63, 0x1A, 0xFD, 0xBE, 0x38, 0x47, 0x4C, 0xAA, 0x72, 0xD8, 0x8E,
0x22, 0x68, 0x35, 0x01, 0xC2, 0x66, 0x94, 0xB1, 0x04, 0xFB, 0x7A, 0x81, 0xE0, 0x64, 0xD9, 0x09,
0x79, 0x13, 0xF6, 0xF5, 0xFA, 0x28, 0xA4, 0x14, 0xDA, 0x4C, 0x31, 0x09, 0xB1, 0x65, 0xA7, 0x50,
0x20, 0xCC, 0x38, 0x1A, 0xC2, 0xAE, 0xE7, 0xE3, 0x90, 0xAE, 0x60, 0x5E, 0x0D, 0x67, 0xFB, 0x4C,
0x2D, 0x13, 0x5D, 0xBB, 0x5A, 0x0C, 0x1A, 0x61, 0x44, 0x5D, 0xC1, 0x7D, 0x23, 0x18, 0xD1, 0xDA,
0x24, 0x07, 0xCD, 0x6F, 0x14, 0xD3, 0x2B, 0x35, 0x05, 0xD3, 0x04, 0xBD, 0xBD, 0x16, 0x47, 0x7F,
0x34, 0x8E, 0xE8, 0x09, 0x46, 0x7B, 0x2C, 0x83, 0x2E, 0xE2, 0x06, 0xBF, 0x94, 0x3F, 0x6C, 0xE3,
0x10, 0xAC, 0x3B, 0x71, 0xC0, 0x40, 0x7E, 0x10, 0x98, 0x00, 0x33, 0x62, 0x26, 0x6C, 0x5F, 0x7E,
0xE7, 0x4E, 0xBC, 0xEA, 0x83, 0xC6, 0x79, 0x90, 0x1F, 0x32, 0xA6, 0xC0, 0x1E, 0x47, 0x78, 0x90,
0x6F, 0x37, 0x53, 0x30, 0xF9, 0xF8, 0xBE, 0x46, 0x10, 0x18, 0x28, 0xCF, 0xC9, 0x7E, 0xF3, 0x41,
0xC7, 0xBC, 0x8F, 0x7B, 0xCD, 0xA0, 0x09, 0xFF, 0x01, 0xE3, 0x6E, 0x3F, 0xD4, 0xB4, 0x09, 0x7F,
0x12, 0x27, 0x0C, 0x1A, 0x8C, 0xDA, 0xB8, 0xEF, 0x32, 0xD7, 0x24, 0x80, 0xFC, 0x47, 0x18, 0xF3,
0xCD, 0xEA, 0xF4, 0x04, 0x90, 0x1F, 0x24, 0xD7, 0xF8, 0x86, 0xCE, 0x3A, 0xA3, 0x52, 0xFE, 0x6C,
0x3F, 0x23, 0xE1, 0x4E, 0x90, 0xC7, 0x49, 0x6A, 0x8B, 0x2F, 0x88, 0x6C, 0x29, 0x6D, 0xF1, 0xB5,
0xDD, 0x07, 0x35, 0xE2, 0x77, 0x04, 0x04, 0x73, 0xCB, 0xCC, 0x01, 0x7B, 0xE4, 0xC2, 0xB3, 0x2A,
0x3F, 0x1F, 0x49, 0xF0, 0x63, 0x20, 0xE8, 0xEB, 0x94, 0x29, 0xE1, 0x0B, 0x52, 0x6A, 0x3A, 0x66,
0x08, 0x41, 0xA0, 0x8D, 0x26, 0x8B, 0x21, 0xE1, 0x02, 0xCF, 0xFC, 0x40, 0xD0, 0x32, 0x36, 0xF3,
0x90, 0x82, 0x05, 0xC9, 0x84, 0x95, 0x03, 0xB1, 0xC7, 0x3E, 0xD3, 0x30, 0xCF, 0xB6, 0x4E, 0x90,
0x37, 0x81, 0x13, 0x5B, 0x29, 0x84, 0xD4, 0xC2, 0xB4, 0x33, 0xC5, 0xB1, 0x56, 0x25, 0x96, 0x65,
0x09, 0xD1, 0xB0, 0xAA, 0xB7, 0x90, 0x63, 0x1C, 0xFC, 0x27, 0x91, 0x63, 0x9C, 0x1F, 0x0F, 0xC8,
0x65, 0xA2, 0x69, 0xCC, 0x5E, 0x14, 0x18, 0x3E, 0x5B, 0xAC, 0xA8, 0x75, 0x40, 0x72, 0x0C, 0xEE,
0xBA, 0xB5, 0x4B, 0x2B, 0x8F, 0xA4, 0xF9, 0xB4, 0xE6, 0x86, 0x4D, 0xB3, 0x5F, 0x29, 0x14, 0x17,
0xF7, 0x20, 0x6C, 0xCD, 0x2D, 0x9A, 0x77, 0x90, 0xA0, 0x3C, 0x6A, 0x8C, 0x24, 0xE8, 0xFC, 0x68,
0xAF, 0x70, 0x20, 0x62, 0xBA, 0x52, 0xA0, 0x70, 0x69, 0x3C, 0x11, 0x54, 0x53, 0xAC, 0x4F, 0x02,
0x9D, 0x4B, 0x70, 0x08, 0x50, 0x7E, 0x0E, 0xC3, 0x89, 0x83, 0xDA, 0x64, 0x2C, 0x8B, 0x81, 0x1E,
0x55, 0x2A, 0x70, 0x06, 0x50, 0x87, 0x77, 0x8A, 0xF5, 0x20, 0x7A, 0xC5, 0xFA, 0xFF, 0x03, 0xAD,
0x58, 0x1F, 0xB9, 0x9C, 0xD9, 0xF3, 0x63, 0x40, 0xCE, 0x3D, 0x46, 0x8E, 0x7F, 0xDC, 0xB2, 0xE7,
0x39, 0x12, 0x31, 0xD7, 0xE6, 0x28, 0x12, 0x33, 0x69, 0xC3, 0x75, 0xD8, 0x44, 0x50, 0xA4, 0xF0,
0x99, 0x00, 0x8A, 0x7B, 0x6C, 0xD6, 0xD5, 0x86, 0xF6, 0xFC, 0x92, 0x41, 0x44, 0xD2, 0x47, 0x82,
0xE2, 0xEB, 0x72, 0x36, 0x40, 0x46, 0x97, 0x8E, 0xB3, 0xCF, 0x54, 0xB5, 0x63, 0xF7, 0x41, 0xF3,
0x23, 0xA1, 0x9A, 0x0F, 0xFD, 0x68, 0xEC, 0x25, 0xA9, 0x07, 0xB5, 0xFD, 0x57, 0x62, 0xE0, 0x94,
0xA7, 0xFA, 0x42, 0x21, 0xD1, 0xE7, 0x11, 0x3C, 0x7D, 0x24, 0x41, 0x6C, 0xE5, 0x12, 0xF4, 0xB9,
0x00, 0x59, 0x97, 0xA1, 0x27, 0x04, 0xC9, 0xB8, 0x54, 0x6F, 0x09, 0x0B, 0x33, 0xB6, 0x4D, 0x2C,
0x8D, 0xEC, 0xAB, 0x35, 0xB1, 0x6D, 0x61, 0x5D, 0x1C, 0x89, 0xDD, 0xF3, 0x84, 0x12, 0x9F, 0x2F,
0xDC, 0xFA, 0x9C, 0x8A, 0xDF, 0xC2, 0x3D, 0x52, 0xFA, 0x7C, 0x1B, 0x08, 0x77, 0xF4, 0xD9, 0xCC,
0x44, 0x08, 0xCB, 0xF2, 0xCC, 0x0E, 0x88, 0x2A, 0xDC, 0x71, 0x58, 0x6B, 0x05, 0xA1, 0x05, 0x98,
0x7B, 0x1B, 0xDB, 0x66, 0x2F, 0x20, 0x40, 0xB1, 0x26, 0x37, 0x83, 0xD0, 0xA5, 0xDB, 0x2B, 0x63,
0x60, 0x93, 0xE6, 0x6A, 0x0D, 0x96, 0xD8, 0xCC, 0x93, 0x04, 0x8B, 0x7E, 0xF6, 0xF1, 0x87, 0x02,
0x92, 0xBD, 0x34, 0x06, 0x85, 0x51, 0xCB, 0x4A, 0xBB, 0x2F, 0x3F, 0x32, 0x99, 0x62, 0x52, 0x4F,
0xBE, 0x6D, 0xDB, 0xE7, 0x3F, 0x54, 0xEA, 0x13, 0xF2, 0x6E, 0xD4, 0xAF, 0x1E, 0x28, 0x61, 0x87,
0x07, 0xF5, 0x8B, 0xDF, 0xDB, 0x59, 0xD3, 0x4B, 0x3A, 0xB6, 0xF0, 0x20, 0x2C, 0xFA, 0xFA, 0x9E,
0x25, 0x61, 0xF2, 0x41, 0x01, 0x71, 0xA8, 0x09, 0x9F, 0xAD, 0xA0, 0x06, 0x18, 0x16, 0xBF, 0x56,
0xD9, 0x57, 0x0F, 0xE2, 0x9D, 0x2F, 0x80, 0x56, 0xC1, 0xC6, 0x1D, 0x5F, 0xE5, 0x12, 0x20, 0xDF,
0x43, 0x8D, 0xD1, 0xA0, 0xFD, 0x08, 0xF2, 0x8B, 0x9C, 0xFC, 0xE6, 0x11, 0xD8, 0x51, 0x03, 0xD2,
0x1D, 0xDE, 0x8B, 0x1F, 0x45, 0x90, 0x5F, 0x9D, 0xE4, 0x0D, 0xC9, 0xDF, 0x4F, 0x2B, 0xEC, 0x06,
0xBE, 0xA0, 0xB3, 0x2F, 0x28, 0x8F, 0x8A, 0xB6, 0xD2, 0x7B, 0x40, 0x7E, 0xDF, 0xE6, 0xA2, 0xF7,
0xE9, 0x12, 0xB7, 0x6F, 0x36, 0x1D, 0x91, 0xC8, 0xB1, 0x1E, 0x0A, 0x7C, 0xF6, 0x82, 0x76, 0x94,
0x80, 0x12, 0x44, 0x91, 0x39, 0x99, 0x58, 0x90, 0x11, 0x0A, 0xBC, 0xC8, 0xB4, 0x68, 0x2C, 0x9B,
0x58, 0x1C, 0x97, 0x77, 0x41, 0xFD, 0x9E, 0x74, 0x9A, 0xF0, 0xF7, 0x63, 0x92, 0x4D, 0x15, 0xE0,
0xC4, 0x91, 0x8C, 0x72, 0xB2, 0xE3, 0xA1, 0x08, 0x2A, 0xD6, 0xE1, 0x4D, 0xA5, 0xFB, 0xC1, 0xB3,
0x35, 0x39, 0xE3, 0x25, 0x71, 0xE1, 0x56, 0x3A, 0x44, 0x91, 0x7E, 0x13, 0x3E, 0x49, 0x1C, 0xA2,
0x2A, 0xBF, 0x6C, 0xE2, 0x97, 0xC4, 0xB2, 0x09, 0x33, 0xF6, 0x9E, 0x19, 0x8B, 0xE3, 0x4D, 0x51,
0x53, 0x12, 0xC7, 0x68, 0x7A, 0x6E, 0xEC, 0x18, 0x7E, 0x1D, 0x9D, 0x26, 0xDF, 0xE0, 0x1D, 0x3D,
0xC7, 0x2A, 0xCF, 0xC3, 0x45, 0x6A, 0xCB, 0x93, 0xA2, 0x62, 0xDF, 0x5B, 0x69, 0xCB, 0xA3, 0xC2,
0xF5, 0xC7, 0xD8, 0x20, 0x7F, 0x28, 0xD5, 0x9F, 0xA0, 0x72, 0x4B, 0xA0, 0x36, 0xDD, 0x91, 0xE7,
0xDE, 0x06, 0xC3, 0xA3, 0x1C, 0xD1, 0xBB, 0x34, 0xCC, 0x91, 0x4B, 0xD1, 0x45, 0x1B, 0x96, 0x27,
0xE2, 0xEA, 0x22, 0xA5, 0xF2, 0xB7, 0x03, 0xCB, 0xD3, 0xCE, 0x53, 0xE7, 0xA1, 0xCC, 0x59, 0x2E,
0xD7, 0x2B, 0x81, 0x5E, 0xAB, 0xCC, 0xE4, 0xFA, 0xE4, 0xD5, 0x38, 0x4B, 0x16, 0x2C, 0x2C, 0xA9,
0x4B, 0xBA, 0x52, 0xE9, 0x1F, 0xAD, 0xA4, 0x51, 0xF1, 0xF3, 0xDB, 0xB5, 0x9F, 0x9D, 0xDB, 0x86,
0x56, 0x10, 0x78, 0x69, 0xA3, 0xD2, 0x9F, 0x81, 0x23, 0xB3, 0xF9, 0xD6, 0x2A, 0x6A, 0xF3, 0x97,
0xFA, 0x55, 0x55, 0x57, 0x28, 0x4D, 0x6C, 0xA0, 0x3D, 0x5B, 0x36, 0x9E, 0x39, 0x94, 0xAD, 0xBB,
0x6C, 0xE6, 0xB5, 0x9F, 0x42, 0x97, 0x54, 0x9D, 0xF3, 0x72, 0xCE, 0x30, 0xFB, 0x96, 0x62, 0x3E,
0xE6, 0x8D, 0x5E, 0x47, 0x3F, 0xA2, 0x4B, 0xC9, 0x2F, 0xB1, 0x2C, 0xE3, 0x38, 0x34, 0x0C, 0xAD,
0x62, 0xF8, 0x9C, 0x30, 0x35, 0x53, 0x8E, 0xB2, 0x72, 0x12, 0x13, 0x40, 0x16, 0xAA, 0x28, 0x49,
0x87, 0x63, 0xB4, 0x00, 0xC5, 0x4B, 0xC8, 0x53, 0xB1, 0x84, 0xB4, 0x8D, 0x3A, 0xCB, 0xCB, 0x19,
0xFA, 0x32, 0xDD, 0x70, 0xB2, 0x5E, 0x0F, 0xEF, 0x62, 0x1B, 0x3F, 0xAA, 0xD0, 0xCE, 0x61, 0xF2,
0x6B, 0x0C, 0xC1, 0x92, 0x7F, 0xA2, 0x55, 0x86, 0x63, 0x8D, 0x12, 0x20, 0x6A, 0xD4, 0xAE, 0x49,
0x37, 0x93, 0xEC, 0xBB, 0x36, 0x23, 0x7B, 0x81, 0xE7, 0xD4, 0xBE, 0x51, 0x95, 0x65, 0x6F, 0xB3,
0x9C, 0xFA, 0x77, 0xBC, 0x32, 0xB5, 0x60, 0xAD, 0x29, 0xFE, 0xFE, 0x5A, 0xF6, 0xCE, 0x0A, 0x71,
0xB2, 0xEC, 0xA9, 0x38, 0xE7, 0x66, 0x86, 0x53, 0xCC, 0xBA, 0xC8, 0x3B, 0x5A, 0xF9, 0xC5, 0x1C,
0xA7, 0x48, 0x2B, 0x3F, 0xAE, 0xE3, 0xEC, 0x4D, 0x39, 0xB8, 0xB2, 0x59, 0xDF, 0x03, 0x29, 0xD4,
0xB9, 0x31, 0x01, 0x53, 0xEA, 0x1E, 0xF5, 0x2C, 0x45, 0x67, 0xAB, 0xA1, 0x50, 0x78, 0xCD, 0x4B,
0x18, 0x5C, 0xF7, 0x5C, 0x6F, 0x2D, 0x13, 0xB7, 0x66, 0x76, 0xBC, 0x77, 0xF0, 0x48, 0x81, 0x38,
0xF2, 0xD9, 0xEB, 0x8F, 0x6C, 0xAC, 0xA5, 0xFC, 0x07, 0xAB, 0x93, 0x24, 0x94, 0x78, 0x9C, 0xED,
0xD8, 0xDB, 0x4D, 0x02, 0x51, 0x10, 0xC6, 0xF1, 0x55, 0x41, 0x45, 0x30, 0xB1, 0x02, 0x62, 0x05,
0x60, 0x07, 0xDA, 0x81, 0x76, 0x80, 0x1D, 0x68, 0x07, 0xDA, 0x81, 0x76, 0x80, 0x1D, 0x68, 0x07,
0xDA, 0x01, 0x76, 0x40, 0xB4, 0x01, 0x13, 0x45, 0xBC, 0x5F, 0x5E, 0x78, 0xD9, 0xEF, 0xDC, 0xE6,
0x9B, 0xD9, 0x27, 0x9D, 0x7D, 0x3D, 0x67, 0x7F, 0xEC, 0x26, 0xFF, 0x84, 0x3D, 0x53, 0x55, 0x92,
0xEB, 0xE2, 0x27, 0x75, 0xED, 0x8B, 0xEE, 0x0F, 0xAE, 0xE7, 0x86, 0xC1, 0xED, 0xA4, 0xA7, 0x04,
0x6F, 0x9B, 0x06, 0xDF, 0x1A, 0x06, 0x0F, 0xD2, 0x9E, 0x0E, 0x7C, 0x6C, 0x1A, 0xFC, 0x6A, 0x18,
0x3C, 0xCF, 0x78, 0x2A, 0x30, 0x1D, 0xA1, 0x0E, 0xCC, 0x44, 0xA8, 0x03, 0x6F, 0x9A, 0x06, 0x33,
0x11, 0xAA, 0xC0, 0x20, 0xC2, 0xB9, 0x11, 0xBC, 0x07, 0x6F, 0x34, 0x33, 0x82, 0x9F, 0x00, 0x76,
0x8C, 0xE0, 0x29, 0x78, 0x93, 0xCA, 0x08, 0xCE, 0x00, 0x1C, 0x1A, 0xC1, 0xAD, 0x6F, 0x00, 0xDB,
0x46, 0x10, 0x23, 0x1C, 0xE3, 0x33, 0xB3, 0xE0, 0x2B, 0x80, 0x3D, 0x23, 0xB8, 0x07, 0xDE, 0xC3,
0xB2, 0x11, 0xBC, 0x03, 0x70, 0x54, 0x19, 0xC1, 0x20, 0x42, 0x23, 0x18, 0x46, 0x68, 0x04, 0x31,
0xC2, 0x81, 0x11, 0x0C, 0x22, 0x6C, 0x19, 0xC1, 0x2B, 0xF0, 0xCE, 0x22, 0x8F, 0x4D, 0x81, 0x91,
0x08, 0x4D, 0x60, 0x10, 0xE1, 0x92, 0x11, 0xC4, 0x08, 0x17, 0xF7, 0xEA, 0xC1, 0x0F, 0x00, 0xD7,
0x8D, 0xE0, 0x31, 0x78, 0x93, 0xCA, 0x08, 0x3E, 0x01, 0xD8, 0x37, 0x82, 0xF1, 0x08, 0x0D, 0x60,
0x3C, 0x42, 0x03, 0xF8, 0x02, 0x60, 0xCF, 0x08, 0xEE, 0x80, 0xB7, 0x88, 0x50, 0x0F, 0x26, 0x22,
0xD4, 0x83, 0x89, 0x08, 0xD5, 0x60, 0x2A, 0x42, 0x35, 0x98, 0x8A, 0x50, 0x0B, 0x26, 0x23, 0xD4,
0x82, 0xC9, 0x08, 0xB5, 0x20, 0x46, 0xD8, 0x35, 0x82, 0xE9, 0x08, 0x95, 0x20, 0x1E, 0xC5, 0x6A,
0x77, 0x69, 0xC0, 0x77, 0x00, 0xD7, 0x8C, 0xE0, 0x21, 0x78, 0xD7, 0xB5, 0x55, 0x05, 0x98, 0x89,
0x50, 0x07, 0xE2, 0x51, 0xAC, 0x55, 0x5B, 0xE5, 0x41, 0x9C, 0x07, 0x9C, 0xD4, 0x97, 0x79, 0x70,
0x0E, 0x60, 0xB7, 0xBE, 0x4C, 0x83, 0x78, 0x14, 0xAB, 0x45, 0xA8, 0x01, 0x31, 0xC2, 0x5D, 0x58,
0xA7, 0xC1, 0x6C, 0x84, 0x0A, 0x30, 0x1F, 0xA1, 0x02, 0xC4, 0x79, 0x40, 0x1F, 0x37, 0xB0, 0x20,
0x46, 0xB8, 0x62, 0x04, 0x0B, 0x11, 0xF2, 0x20, 0xCE, 0x03, 0xBA, 0xC1, 0x0E, 0x0E, 0x2C, 0x45,
0x48, 0x83, 0xA5, 0x08, 0x69, 0x10, 0xE7, 0x01, 0x18, 0x21, 0x0B, 0xE2, 0x3C, 0x20, 0x88, 0x90,
0x05, 0x8B, 0x11, 0xB2, 0x60, 0x31, 0x42, 0x12, 0xC4, 0xA1, 0x54, 0x18, 0x21, 0x09, 0x62, 0x84,
0x1B, 0x46, 0x10, 0x23, 0x9C, 0x86, 0x11, 0x72, 0x20, 0xCE, 0x03, 0x22, 0x11, 0x72, 0x20, 0x46,
0xB8, 0x6A, 0x04, 0x31, 0xC2, 0xCB, 0xF8, 0x36, 0x39, 0x88, 0x43, 0xA9, 0x4D, 0x2B, 0x88, 0xF3,
0x80, 0x58, 0x84, 0x0C, 0x88, 0xF3, 0x80, 0xA3, 0xC4, 0x3E, 0x31, 0x88, 0xF3, 0x80, 0x68, 0x84,
0x04, 0x88, 0x5F, 0xC1, 0x53, 0xD9, 0x0F, 0xA7, 0x41, 0x59, 0x84, 0x04, 0x88, 0xF3, 0x80, 0x78,
0x84, 0x72, 0x10, 0xE7, 0x01, 0x89, 0x08, 0xE5, 0x20, 0x1E, 0xC5, 0x12, 0x11, 0xCA, 0x41, 0x8C,
0x70, 0xD9, 0x08, 0x4A, 0x23, 0x14, 0x83, 0xD2, 0x08, 0xA5, 0xA0, 0x38, 0x42, 0x29, 0x88, 0x47,
0xB1, 0xA1, 0x15, 0x14, 0x47, 0x28, 0x04, 0xE5, 0x11, 0x0A, 0x41, 0x79, 0x84, 0x42, 0x10, 0xE7,
0x01, 0xE9, 0x08, 0x65, 0x20, 0xCE, 0x03, 0x46, 0x39, 0x4F, 0x02, 0xE2, 0x51, 0xAC, 0x63, 0x04,
0x99, 0x08, 0x45, 0x20, 0x13, 0xA1, 0x08, 0xC4, 0x79, 0x40, 0xDB, 0x08, 0xE2, 0x3C, 0x60, 0x9C,
0xF7, 0xCA, 0x20, 0x15, 0xA1, 0x04, 0xA4, 0x22, 0x14, 0x80, 0x5C, 0x84, 0x02, 0x90, 0x8B, 0xB0,
0x0C, 0x62, 0x84, 0x93, 0x98, 0xC1, 0x80, 0x64, 0x84, 0x65, 0x10, 0xDF, 0xB8, 0x10, 0x61, 0x19,
0x84, 0x3F, 0x93, 0x52, 0x84, 0x34, 0xD8, 0x8B, 0x11, 0x16, 0xB0, 0x14, 0x21, 0x0B, 0x16, 0x23,
0x64, 0xC1, 0x62, 0x84, 0x24, 0x58, 0x8E, 0x90, 0x04, 0x07, 0x4D, 0x83, 0xE5, 0x08, 0x39, 0x50,
0xF4, 0xC6, 0x7F, 0x0B, 0x6C, 0xE2, 0xEA, 0x39, 0xE8, 0xA0, 0x83, 0x0E, 0x3A, 0xE8, 0xA0, 0x83,
0x0E, 0xCA, 0x41, 0xD1, 0xE7, 0x0C, 0xF3, 0x6D, 0xE3, 0xA0, 0x83, 0x0E, 0x3A, 0xE8, 0xA0, 0x83,
0x0E, 0x3A, 0xE8, 0xA0, 0x83, 0x0E, 0x3A, 0xE8, 0xA0, 0x83, 0x0E, 0x3A, 0xE8, 0xE0, 0x3F, 0x01,
0x7F, 0x01, 0x5D, 0x59, 0xFC, 0xB5, 0x78, 0x9C, 0xED, 0x9A, 0x4B, 0x6C, 0x8C, 0x51, 0x14, 0xC7,
0x6F, 0x0D, 0x9D, 0x76, 0xBC, 0xC6, 0x42, 0x90, 0x78, 0xCC, 0x4E, 0x88, 0x68, 0x23, 0xD2, 0x78,
0x24, 0x88, 0x85, 0xA5, 0x56, 0x2C, 0xD8, 0x95, 0x95, 0xC4, 0x06, 0x09, 0x4B, 0xA9, 0x44, 0xC2,
0x54, 0x48, 0x91, 0x10, 0x91, 0xD0, 0x86, 0x58, 0x58, 0x34, 0xC4, 0x33, 0x84, 0xD4, 0xC6, 0x46,
0xC2, 0x10, 0x56, 0x82, 0x11, 0x42, 0x6C, 0xF8, 0x3C, 0xEA, 0x51, 0xDA, 0x5E, 0xF3, 0xB5, 0xD3,
0x9A, 0xF3, 0xB8, 0xF7, 0x9E, 0xB9, 0xBE, 0x85, 0xC4, 0xFD, 0xEF, 0xCC, 0x77, 0xEF, 0xAF, 0xF7,
0xDC, 0xC7, 0xB9, 0xE7, 0xDC, 0x43, 0x29, 0xA5, 0xF4, 0xDF, 0xAA, 0x43, 0x0D, 0x29, 0x70, 0x02,
0x27, 0x70, 0x02, 0x27, 0x70, 0x02, 0x27, 0x70, 0x92, 0xE6, 0xD4, 0x29, 0x5F, 0x05, 0x4E, 0xE0,
0x04, 0x4E, 0xE0, 0x04, 0x4E, 0xE0, 0x04, 0x4E, 0xE0, 0x04, 0x4E, 0xE0, 0x04, 0xCE, 0xEA, 0x7D,
0xF7, 0x9E, 0x0F, 0xEA, 0xE8, 0xC5, 0xAD, 0xF6, 0x35, 0x63, 0xBC, 0x39, 0xB9, 0xE3, 0xFD, 0x95,
0xDF, 0xBA, 0x9B, 0xBC, 0x38, 0xD9, 0x63, 0x83, 0x1A, 0xA9, 0x67, 0x6E, 0xF5, 0x9C, 0xCD, 0xBF,
0x30, 0x25, 0xD6, 0x21, 0xA3, 0x75, 0x06, 0xCE, 0x59, 0x8E, 0x52, 0x52, 0x71, 0x5A, 0x55, 0x9C,
0xBB, 0x06, 0x4C, 0x49, 0xF3, 0xAA, 0xE0, 0x3C, 0x31, 0x63, 0xB4, 0x5E, 0x2E, 0xE6, 0x5C, 0xB2,
0x61, 0xB4, 0x9E, 0x2F, 0xE4, 0x6C, 0xB2, 0x63, 0xB4, 0x9E, 0x21, 0xE3, 0xFC, 0x74, 0x71, 0xA2,
0x5A, 0x09, 0xE7, 0x91, 0x0B, 0xA3, 0x75, 0x81, 0x2E, 0x3F, 0x6C, 0x70, 0x30, 0x9F, 0xCF, 0x0F,
0xB8, 0x39, 0xBA, 0xD5, 0xC1, 0x11, 0x2B, 0x93, 0x10, 0xA7, 0x88, 0x2D, 0xF3, 0xE4, 0xE8, 0xB5,
0x09, 0x71, 0x74, 0x6D, 0x42, 0x9C, 0xB6, 0x84, 0x38, 0x3A, 0x9D, 0x10, 0xA7, 0x23, 0x21, 0x0E,
0x9C, 0xA1, 0xBF, 0xE0, 0xB4, 0x26, 0xC4, 0xD1, 0xA9, 0x84, 0x38, 0xB3, 0x13, 0xE2, 0x14, 0x12,
0xE2, 0xE8, 0x7A, 0x21, 0xE7, 0xFE, 0xC9, 0xF6, 0xFC, 0x89, 0xF3, 0xCF, 0x8C, 0xDF, 0x9B, 0x25,
0x9C, 0x53, 0x4D, 0x35, 0xE5, 0x36, 0xD9, 0x9D, 0x4F, 0xF9, 0x26, 0x51, 0x8D, 0x93, 0x73, 0x7A,
0x2A, 0xD8, 0x66, 0xEB, 0x78, 0x27, 0x99, 0x71, 0x71, 0x96, 0x2A, 0xAC, 0xAB, 0x5C, 0xB3, 0x56,
0x3B, 0xA7, 0xC8, 0x38, 0x60, 0x75, 0x94, 0x33, 0xCC, 0xCA, 0x29, 0x8E, 0x63, 0x30, 0x4A, 0x1D,
0x61, 0x9A, 0xD6, 0x59, 0x38, 0xDC, 0x75, 0x30, 0x24, 0xE6, 0x5E, 0x6B, 0xB0, 0x70, 0xEA, 0x0D,
0x18, 0xA5, 0xBE, 0x91, 0xB6, 0x17, 0xCC, 0x1C, 0xEC, 0x31, 0x2B, 0x94, 0xED, 0x27, 0xAD, 0xC7,
0x98, 0x38, 0x3D, 0x35, 0x66, 0x8E, 0x3A, 0x4C, 0x9A, 0x67, 0x4C, 0x1C, 0xB3, 0x55, 0xB1, 0xBE,
0x9B, 0x26, 0x08, 0xFF, 0xDE, 0x61, 0xC5, 0xD0, 0xBB, 0xBF, 0xD3, 0xC0, 0x49, 0x5B, 0x31, 0xCC,
0x54, 0xF3, 0x1C, 0xC7, 0x70, 0x94, 0xDA, 0x83, 0x39, 0xB5, 0x2C, 0x87, 0xDC, 0xB7, 0x44, 0xF8,
0xA0, 0x4D, 0xE4, 0x38, 0x05, 0x3B, 0x23, 0xD6, 0x43, 0xC4, 0x69, 0xE0, 0x38, 0x0D, 0x76, 0x46,
0xAC, 0x46, 0x7E, 0x26, 0x58, 0x63, 0xAD, 0x42, 0x4B, 0x5F, 0x64, 0x38, 0x3D, 0x02, 0x0C, 0x31,
0x2C, 0x45, 0x39, 0x02, 0xB3, 0x94, 0x5A, 0x85, 0x38, 0x69, 0xCA, 0x91, 0xA5, 0x3B, 0x28, 0xD2,
0x1F, 0x3F, 0xF4, 0x63, 0xBE, 0x52, 0xB6, 0xA3, 0xF5, 0x47, 0x5F, 0x20, 0x67, 0xB2, 0xA8, 0x13,
0xA3, 0x3B, 0x90, 0xD3, 0xEC, 0xEE, 0xC1, 0xAB, 0x05, 0x72, 0x9C, 0x47, 0xC0, 0x28, 0x98, 0x50,
0x89, 0x16, 0x99, 0x55, 0x1F, 0xE0, 0x44, 0xEE, 0x0E, 0x06, 0xA1, 0x89, 0x76, 0x64, 0x9C, 0x66,
0xBD, 0x84, 0x1C, 0xFE, 0x76, 0x11, 0xA8, 0x8B, 0xDB, 0x88, 0x1E, 0x42, 0x4E, 0xD1, 0xEE, 0x89,
0x2D, 0xCA, 0x71, 0x1B, 0xDA, 0x47, 0x90, 0x33, 0xC9, 0x9B, 0x03, 0xAF, 0x31, 0xEF, 0x83, 0x81,
0x7C, 0xEB, 0x1C, 0x6F, 0x0E, 0x74, 0x65, 0x22, 0x6F, 0xC3, 0xEA, 0x2B, 0xE0, 0xAC, 0xF4, 0xE6,
0xF4, 0x02, 0x0E, 0x4D, 0x0E, 0xA5, 0xFA, 0x0C, 0x38, 0xDB, 0xBC, 0x39, 0x9F, 0xFE, 0x31, 0xCE,
0x47, 0xC0, 0x69, 0x73, 0x77, 0xF8, 0xCF, 0x38, 0xFF, 0xDA, 0x7A, 0x41, 0x07, 0xED, 0xBF, 0x9F,
0xE1, 0xB9, 0xF0, 0xBE, 0x08, 0x13, 0x3B, 0xA7, 0x3F, 0x00, 0xC7, 0xDF, 0x6F, 0x40, 0x3F, 0xE6,
0xEF, 0x0F, 0x07, 0x12, 0xE2, 0x00, 0xCC, 0x48, 0xC4, 0x5A, 0xBD, 0x50, 0xA8, 0x99, 0xD9, 0x0B,
0x82, 0x28, 0xF9, 0xDB, 0xF3, 0x76, 0xC8, 0xA9, 0x83, 0xCB, 0x27, 0xDF, 0x96, 0x17, 0x21, 0x67,
0x1C, 0x74, 0x8F, 0x82, 0x18, 0xBC, 0x2C, 0x78, 0x4C, 0x75, 0x0A, 0xFD, 0x5B, 0x1C, 0x7F, 0xC0,
0xED, 0xAC, 0x71, 0xA0, 0x27, 0x9E, 0x20, 0xB8, 0x7D, 0x0A, 0x38, 0xBB, 0x13, 0xDF, 0x8B, 0xB0,
0x5B, 0x27, 0x8E, 0x3F, 0xA4, 0xFE, 0x08, 0x75, 0x6B, 0xC5, 0xFB, 0x40, 0x1A, 0xE8, 0xA1, 0xE9,
0x98, 0x83, 0x03, 0x4F, 0x69, 0x60, 0x85, 0xA6, 0x79, 0x22, 0xC9, 0xC9, 0x84, 0x13, 0x84, 0x92,
0xEF, 0x3A, 0x92, 0x6C, 0x76, 0xBA, 0x19, 0x8A, 0xE6, 0x29, 0x29, 0xEC, 0x67, 0xE1, 0xC3, 0x99,
0x51, 0x28, 0x6F, 0x8A, 0xE8, 0x4F, 0xB2, 0x93, 0xCB, 0x18, 0x81, 0x93, 0x5F, 0x49, 0xAA, 0x90,
0x45, 0x7D, 0x62, 0xAF, 0x8A, 0x02, 0x4F, 0xAD, 0xC7, 0xBA, 0x39, 0xE8, 0x90, 0x0E, 0xDB, 0x80,
0xDF, 0x3D, 0x66, 0xBB, 0x28, 0xF4, 0x65, 0x22, 0xCD, 0xD8, 0x2A, 0x38, 0xF3, 0x78, 0xB5, 0xF4,
0x50, 0xEE, 0x87, 0x17, 0xCC, 0x1D, 0x53, 0xBF, 0x42, 0x1D, 0x86, 0x1F, 0x80, 0xBA, 0x30, 0xE7,
0x82, 0x03, 0x93, 0xC5, 0xC5, 0xAC, 0x06, 0x7E, 0x94, 0xAE, 0x87, 0x09, 0x52, 0xDC, 0x28, 0x1B,
0x40, 0x1E, 0x98, 0xEC, 0xD9, 0x5D, 0x8E, 0xD4, 0xD6, 0xCA, 0x5B, 0xB7, 0x17, 0xFF, 0xAE, 0x67,
0xDA, 0x38, 0xAF, 0x4D, 0x7F, 0xF6, 0x0E, 0xE1, 0x44, 0x96, 0xC3, 0x41, 0x2B, 0x48, 0x23, 0x77,
0x72, 0x0B, 0xF9, 0x62, 0x71, 0x67, 0x59, 0x5A, 0xEB, 0x1B, 0x9D, 0x4E, 0xFA, 0x02, 0xA7, 0x17,
0x98, 0x38, 0x6F, 0x68, 0xDB, 0xD1, 0x97, 0x83, 0x2F, 0xF4, 0x1B, 0x5B, 0xDF, 0x2A, 0xE9, 0xB2,
0x6D, 0xEC, 0xF4, 0x25, 0xAF, 0xA4, 0xE9, 0x1C, 0xE6, 0x0C, 0xD3, 0x70, 0xC2, 0x1F, 0x9B, 0xC9,
0x4A, 0xC6, 0x5A, 0x46, 0x31, 0x57, 0xB8, 0x76, 0x15, 0x6B, 0xF2, 0x95, 0xFB, 0x4E, 0x0A, 0xA5,
0x8D, 0xEF, 0xB8, 0x56, 0x95, 0x7E, 0x06, 0xFB, 0x81, 0xB2, 0xA2, 0xAD, 0x15, 0xA4, 0xDC, 0x39,
0x76, 0xD4, 0x15, 0x66, 0x99, 0x0C, 0x8B, 0xD5, 0xBD, 0x65, 0xF1, 0x94, 0xD2, 0xF7, 0x45, 0xBB,
0x6E, 0x98, 0x9A, 0x80, 0x41, 0x73, 0x2B, 0x26, 0x13, 0x0C, 0x78, 0xB7, 0xBB, 0x3B, 0x18, 0x84,
0x02, 0x02, 0xB6, 0x22, 0x2D, 0x10, 0x3E, 0xD2, 0x82, 0x42, 0x27, 0x2B, 0x7C, 0xBB, 0x64, 0x25,
0x95, 0x4E, 0xAA, 0x88, 0xBC, 0xA6, 0x61, 0x5F, 0x29, 0xD3, 0x42, 0x8C, 0x61, 0xBC, 0x93, 0x64,
0x38, 0x4C, 0xF8, 0xE6, 0xB3, 0xF4, 0x2B, 0x28, 0xC6, 0x67, 0x40, 0xDC, 0x70, 0x7C, 0x96, 0x6C,
0x16, 0x87, 0xA9, 0x7E, 0x0F, 0x15, 0x0C, 0x4F, 0x9F, 0xAC, 0x1B, 0xB2, 0xC8, 0xF8, 0x96, 0xC5,
0xBB, 0x0F, 0x93, 0xCC, 0xB1, 0x7F, 0x8E, 0x71, 0xD4, 0x46, 0x15, 0x2D, 0x77, 0x0A, 0x29, 0x04,
0xF8, 0x58, 0x15, 0xEB, 0xB1, 0x18, 0x63, 0xA9, 0x00, 0xC5, 0x7A, 0x2B, 0xC4, 0xB8, 0xC2, 0xD1,
0x6C, 0x9F, 0x9B, 0x51, 0x52, 0xC1, 0x19, 0x8D, 0xE6, 0x9C, 0xFF, 0xE3, 0x42, 0x1B, 0x8B, 0x75,
0x10, 0xE4, 0x1E, 0x91, 0xB1, 0x58, 0x07, 0x4D, 0xFB, 0xE1, 0xC0, 0xB0, 0x15, 0x48, 0x4E, 0x6C,
0x79, 0x73, 0x54, 0x3D, 0x82, 0x80, 0xB6, 0xAC, 0x1D, 0x96, 0x0D, 0xB9, 0x5B, 0x56, 0x50, 0x18,
0x56, 0xEE, 0x9A, 0xC9, 0xA6, 0x25, 0x55, 0x50, 0x62, 0x35, 0x5E, 0xE7, 0x26, 0x78, 0x6B, 0x35,
0x83, 0x19, 0x19, 0xD3, 0x2E, 0x54, 0x99, 0x7E, 0xB0, 0xD1, 0x83, 0x32, 0x8C, 0x5A, 0xBF, 0xFF,
0xE6, 0xB3, 0xF7, 0x83, 0x3A, 0xFA, 0x70, 0xFB, 0xC0, 0x06, 0xFB, 0xD6, 0xFB, 0x0D, 0xFD, 0x98,
0x52, 0x48, 0x78, 0x9C, 0xDD, 0x5A, 0x4D, 0x6F, 0x4D, 0x51, 0x14, 0xBD, 0x4F, 0x4B, 0xFB, 0xA8,
0xB6, 0x66, 0x12, 0xA1, 0x4D, 0x8C, 0x44, 0x68, 0x25, 0x44, 0x22, 0x68, 0x13, 0x49, 0x43, 0x22,
0xD1, 0x18, 0x08, 0x42, 0x98, 0x88, 0x81, 0x50, 0x06, 0x65, 0x58, 0x53, 0x9D, 0x30, 0x21, 0x46,
0xEA, 0x07, 0x48, 0x4A, 0x22, 0x62, 0x22, 0x35, 0x24, 0x06, 0x25, 0xE6, 0x1E, 0x89, 0x88, 0x01,
0x9E, 0xEF, 0x6F, 0xAE, 0x7B, 0xDF, 0xBB, 0x7D, 0xEF, 0x9E, 0xB5, 0xCF, 0xB9, 0x67, 0x9F, 0xE5,
0x99, 0xD8, 0xB3, 0xF7, 0xB5, 0xDE, 0xF9, 0x58, 0x6B, 0x9F, 0xBD, 0xD7, 0xB9, 0x51, 0xA4, 0x8A,
0xAB, 0x31, 0xC4, 0x3C, 0xDD, 0xEF, 0x64, 0x7C, 0x06, 0xA0, 0x43, 0x2C, 0x50, 0x3F, 0x0E, 0xA9,
0xCC, 0x22, 0x3D, 0x04, 0xA0, 0x59, 0x16, 0x28, 0xFA, 0x0E, 0x48, 0x2B, 0x58, 0xA0, 0xC3, 0x38,
0xB9, 0x76, 0x16, 0xE9, 0x03, 0x00, 0x4D, 0xB0, 0x40, 0xD1, 0x2F, 0x40, 0x5A, 0xC4, 0x02, 0x21,
0x99, 0xAA, 0x25, 0x16, 0x09, 0xC9, 0x34, 0xC4, 0x02, 0x0D, 0xE2, 0x7A, 0x2F, 0x60, 0x91, 0x1E,
0x01, 0xD0, 0x34, 0x0B, 0x14, 0xFD, 0x00, 0xA4, 0xC5, 0x2C, 0xD0, 0x49, 0x9C, 0x1C, 0x2D, 0x5E,
0x24, 0x13, 0x2D, 0xDE, 0xDE, 0xDF, 0x80, 0x44, 0x8B, 0xF7, 0x3A, 0x00, 0xF1, 0xE2, 0xFD, 0x02,
0x48, 0xB4, 0x78, 0x05, 0x99, 0x68, 0xF1, 0x3E, 0x03, 0x20, 0x5E, 0xBC, 0x48, 0x26, 0x5A, 0xBC,
0x48, 0x26, 0x5E, 0xBC, 0x1F, 0x01, 0x89, 0x16, 0xAF, 0x20, 0x13, 0x2D, 0x5E, 0x24, 0x13, 0x2F,
0xDE, 0xAF, 0x80, 0x44, 0x8B, 0x77, 0x18, 0xC9, 0x44, 0x8B, 0x17, 0xC9, 0x44, 0x8B, 0x37, 0xFA,
0x09, 0x48, 0xB4, 0x78, 0xCF, 0x02, 0x10, 0x2F, 0x5E, 0x24, 0x13, 0x2D, 0x5E, 0x41, 0x26, 0x5A,
0xBC, 0x77, 0x01, 0x88, 0x17, 0x2F, 0x92, 0x89, 0x16, 0xEF, 0x28, 0x00, 0xF1, 0xE2, 0x7D, 0x0F,
0x48, 0xB4, 0x78, 0x05, 0x99, 0x68, 0xF1, 0x5E, 0x00, 0x20, 0x5E, 0xBC, 0x9F, 0x00, 0x89, 0x16,
0xAF, 0xA8, 0x51, 0x69, 0xF1, 0x62, 0x8D, 0xCA, 0x8B, 0xF7, 0x1B, 0x20, 0xD1, 0xE2, 0x45, 0x32,
0xF1, 0xE2, 0x45, 0x32, 0xD1, 0xE2, 0x15, 0x35, 0x2A, 0x2D, 0x5E, 0xAC, 0x51, 0x79, 0xF1, 0x62,
0x8D, 0x4A, 0x8B, 0x17, 0xC9, 0xC4, 0x8B, 0x17, 0xC9, 0xC4, 0x8B, 0x17, 0x1B, 0x1E, 0x5A, 0xBC,
0xD8, 0xF0, 0xF0, 0xE2, 0xC5, 0x1A, 0x95, 0x16, 0xAF, 0x20, 0x13, 0x2D, 0x5E, 0x24, 0x13, 0x2F,
0x5E, 0x24, 0x53, 0x27, 0x0B, 0x84, 0x35, 0x2A, 0x2F, 0x5E, 0x6C, 0x78, 0x78, 0xF1, 0x22, 0x99,
0x68, 0xF1, 0x62, 0x8D, 0xCA, 0x8B, 0x17, 0xC9, 0x44, 0x8B, 0x17, 0xCB, 0x8A, 0x0A, 0x2D, 0x5E,
0xAC, 0x51, 0x79, 0xF1, 0x62, 0xC3, 0x43, 0x8B, 0x17, 0xC9, 0xC4, 0x8B, 0x17, 0x6B, 0x54, 0x5E,
0xBC, 0xD8, 0xF0, 0xD0, 0xE2, 0x45, 0x32, 0xF1, 0xE2, 0xFD, 0x77, 0x35, 0x2A, 0xCD, 0x26, 0x24,
0x53, 0x1C, 0x77, 0xA5, 0x6F, 0xAF, 0x3B, 0x72, 0xFA, 0xCC, 0xD1, 0x3D, 0xEB, 0x43, 0xD6, 0x0C,
0xC9, 0x94, 0xA6, 0x94, 0xDD, 0xB7, 0x1B, 0x29, 0x74, 0x76, 0x72, 0x83, 0x12, 0x48, 0x74, 0xCF,
0x49, 0x40, 0x26, 0x9E, 0xDD, 0xA7, 0x9A, 0x2F, 0x92, 0xC9, 0x1A, 0x95, 0xED, 0x0A, 0x24, 0xCC,
0x4C, 0x8E, 0xB8, 0xD2, 0xE6, 0x03, 0x12, 0xBE, 0x9E, 0x2B, 0xAA, 0x4B, 0x3D, 0x48, 0x58, 0x33,
0x15, 0xC4, 0xA6, 0x62, 0x24, 0x2C, 0xC0, 0x8B, 0x62, 0x67, 0x11, 0x90, 0xF0, 0x99, 0x68, 0x28,
0x4C, 0xBB, 0x9E, 0x58, 0xED, 0x46, 0xC2, 0x33, 0xDC, 0x17, 0xCE, 0x03, 0x35, 0x6C, 0x72, 0x49,
0x54, 0x5D, 0xC7, 0x57, 0xC0, 0xCE, 0x65, 0x31, 0xE5, 0x40, 0x0A, 0xD9, 0xB9, 0x2C, 0xB6, 0xB4,
0x66, 0x72, 0x69, 0x74, 0xD8, 0x90, 0xDE, 0x31, 0x48, 0xD6, 0xF3, 0x02, 0x13, 0xB8, 0x2E, 0x96,
0x4B, 0x20, 0xEC, 0x53, 0x94, 0x51, 0x95, 0xD9, 0xEF, 0x29, 0x87, 0x14, 0x6F, 0x15, 0x48, 0x32,
0x5B, 0x2A, 0x03, 0x49, 0xD5, 0xCB, 0x02, 0x89, 0xBA, 0x41, 0x5C, 0xF1, 0xE8, 0x03, 0xD2, 0x5E,
0xA0, 0x7A, 0xF3, 0xB1, 0xD6, 0x44, 0x22, 0x08, 0x3E, 0x17, 0xE6, 0x91, 0x28, 0x5C, 0xB4, 0x90,
0xE8, 0xCA, 0x23, 0x61, 0xEF, 0x14, 0x14, 0x06, 0xD1, 0xD1, 0x65, 0x68, 0x46, 0x65, 0x72, 0x64,
0x65, 0x32, 0xFC, 0x25, 0xDB, 0xC6, 0xEF, 0x3B, 0xBF, 0x93, 0x2F, 0xD6, 0x5C, 0x49, 0x6E, 0x66,
0x63, 0xEE, 0x4B, 0xFD, 0x17, 0x1D, 0x5F, 0x1B, 0x68, 0x7E, 0xC7, 0x21, 0x95, 0xEA, 0x0E, 0x64,
0xDD, 0x2D, 0xFB, 0xB8, 0x7D, 0xCB, 0x34, 0x63, 0xC9, 0x89, 0xA7, 0xAC, 0xC3, 0x6A, 0xE6, 0x61,
0xEB, 0x32, 0x4D, 0x59, 0x4B, 0x93, 0x61, 0x1B, 0x5F, 0x9A, 0x3C, 0xB7, 0x7D, 0x3A, 0xE5, 0xA8,
0x24, 0x6C, 0x50, 0x8D, 0x1E, 0xC9, 0x56, 0xA2, 0xCC, 0x38, 0x8B, 0xA5, 0x51, 0xAC, 0xD6, 0xE2,
0x66, 0xEE, 0xB4, 0x88, 0xAE, 0x3A, 0xDF, 0x05, 0x24, 0x2D, 0xAE, 0x24, 0xFA, 0xB2, 0x8F, 0x2C,
0x89, 0x77, 0x99, 0x1B, 0x28, 0x8A, 0x9E, 0xCB, 0xA5, 0xC8, 0x3E, 0x41, 0xB7, 0xD1, 0xD7, 0x3F,
0xF5, 0xCA, 0x4C, 0x9D, 0xAD, 0x85, 0x9C, 0xB8, 0xA7, 0xA5, 0x43, 0x3F, 0x38, 0x8E, 0x17, 0xD6,
0xDE, 0x97, 0xF2, 0x5D, 0x5B, 0x0C, 0x24, 0x3B, 0xE5, 0x8C, 0xE6, 0x62, 0xC1, 0x2D, 0x69, 0x1E,
0x42, 0x88, 0xA2, 0xBE, 0x50, 0x62, 0xC1, 0xBD, 0x43, 0xB2, 0x70, 0xB9, 0x64, 0x1D, 0xAA, 0xA2,
0xEE, 0x16, 0x27, 0x76, 0x8D, 0x51, 0xB8, 0x13, 0xBB, 0xFC, 0x40, 0xD2, 0x10, 0x4C, 0x7B, 0x2E,
0x71, 0xAC, 0x58, 0x0F, 0x7B, 0x0C, 0x74, 0xBC, 0x53, 0xE9, 0xE1, 0xEA, 0xCD, 0x68, 0x80, 0x44,
0x87, 0x93, 0x2E, 0x39, 0x6E, 0x9D, 0xB2, 0x7D, 0xC2, 0xD5, 0x8D, 0xE4, 0x39, 0x5E, 0xA0, 0xB8,
0x7C, 0x60, 0xB3, 0xD4, 0x2E, 0x8E, 0x3A, 0xDD, 0xE4, 0xA4, 0x95, 0x57, 0x16, 0x15, 0xC1, 0x80,
0x1F, 0xA4, 0x1E, 0xB0, 0x7B, 0xDD, 0x82, 0x04, 0x0B, 0xB5, 0x48, 0x40, 0xE8, 0x64, 0x04, 0x30,
0x4A, 0x75, 0x3B, 0x08, 0x69, 0x6A, 0x0C, 0x13, 0xA6, 0x76, 0x99, 0xC4, 0x42, 0x4D, 0x63, 0x03,
0xA5, 0x22, 0x78, 0x3D, 0xCC, 0x65, 0xA9, 0xE2, 0x20, 0xBB, 0xF5, 0x48, 0xA0, 0xE2, 0x12, 0xD0,
0x3E, 0xC0, 0x93, 0x7B, 0x6B, 0xFE, 0xB2, 0x1D, 0x5F, 0xEB, 0x91, 0x80, 0x9B, 0x1D, 0xB0, 0x99,
0x7A, 0x20, 0x5C, 0xE1, 0xB2, 0xE9, 0x5A, 0xE8, 0xB7, 0x4E, 0x1C, 0x93, 0x5D, 0xA6, 0x12, 0x83,
0x4C, 0x39, 0x13, 0xA9, 0xDB, 0x3C, 0xA2, 0x02, 0x48, 0x80, 0x45, 0x40, 0x8F, 0x29, 0x9F, 0x3E,
0xFF, 0xEF, 0x9B, 0x01, 0x3F, 0x35, 0xF9, 0xD5, 0x13, 0x82, 0x64, 0x6A, 0x7F, 0xC8, 0x1C, 0x62,
0x90, 0x05, 0x66, 0x52, 0x73, 0x97, 0x59, 0x5A, 0x05, 0x99, 0x97, 0x66, 0x66, 0x3B, 0x64, 0xE6,
0x63, 0x75, 0x4E, 0x49, 0xC3, 0xEC, 0x77, 0xC7, 0x8C, 0x57, 0x61, 0xB7, 0x4F, 0xEF, 0x8A, 0x90,
0x82, 0xAC, 0x70, 0x53, 0x68, 0x13, 0xFF, 0x37, 0x92, 0xB9, 0x77, 0x7F, 0xB3, 0xE2, 0xAD, 0x63,
0x41, 0xEB, 0x98, 0xD9, 0x3A, 0xB5, 0xB4, 0x4E, 0xC1, 0x66, 0x6A, 0x50, 0x9F, 0xE5, 0x69, 0x40,
0x56, 0x69, 0x5D, 0xA6, 0x33, 0xB3, 0xEF, 0xF9, 0x10, 0x24, 0xE3, 0x97, 0x71, 0x77, 0xEB, 0x4E,
0x04, 0xFE, 0x94, 0x82, 0xFA, 0xB7, 0xCC, 0x9F, 0x9C, 0x70, 0x7A, 0x2F, 0x80, 0xD7, 0x01, 0x72,
0x81, 0xD9, 0xB4, 0xF3, 0x15, 0x06, 0xD4, 0xAC, 0x25, 0x28, 0xA2, 0x03, 0xAE, 0x20, 0x4C, 0x12,
0x54, 0xB0, 0xA0, 0xD2, 0x5F, 0xFB, 0xC1, 0xD6, 0x4D, 0x8B, 0xEE, 0xCE, 0xEB, 0x7D, 0xCF, 0x05,
0xD4, 0xF1, 0x63, 0xC2, 0x5E, 0x57, 0x67, 0x03, 0x70, 0x52, 0x07, 0x44, 0x69, 0xA6, 0xBE, 0x1B,
0x83, 0x11, 0x2C, 0x16, 0x9B, 0xA9, 0x5D, 0x28, 0xB4, 0x06, 0x3A, 0x65, 0xDB, 0xA0, 0xBC, 0x66,
0xC3, 0x66, 0xAA, 0x4D, 0x36, 0x7D, 0xCA, 0xC4, 0x02, 0xAD, 0x45, 0x35, 0x92, 0xFD, 0x9D, 0x6E,
0x7A, 0xD8, 0xB6, 0xD4, 0x1A, 0x61, 0xEC, 0x39, 0x55, 0x27, 0x95, 0xF5, 0x09, 0x04, 0xBC, 0x1F,
0x53, 0xD1, 0x1C, 0xAF, 0x66, 0x6A, 0x66, 0x9D, 0x30, 0x6A, 0x15, 0xE4, 0x14, 0xDE, 0x43, 0x6D,
0x9F, 0x44, 0x9F, 0xAD, 0xE8, 0xF2, 0x45, 0x3F, 0x5F, 0x7B, 0x57, 0xB4, 0xD4, 0x7E, 0xE7, 0x41,
0xDC, 0x16, 0x65, 0x59, 0x5B, 0x38, 0x34, 0xD2, 0x60, 0xF6, 0x0D, 0x29, 0xAB, 0x74, 0xA5, 0x6B,
0xE4, 0xC9, 0x9C, 0xD2, 0x81, 0x2A, 0xBB, 0x3E, 0x08, 0x76, 0x8D, 0x32, 0x2B, 0x4E, 0xDC, 0x6E,
0x06, 0x3B, 0x59, 0x8D, 0x7F, 0x16, 0xD3, 0x0E, 0x75, 0xD7, 0x1A, 0x39, 0xDB, 0xE2, 0x67, 0x86,
0x39, 0x7E, 0x8D, 0xFF, 0xB5, 0x59, 0xD1, 0x21, 0x2E, 0x64, 0xEE, 0xBC, 0x45, 0xE7, 0xA6, 0x06,
0xA5, 0x77, 0x46, 0x73, 0xE9, 0xC3, 0x6A, 0xD7, 0xEA, 0xDD, 0xDA, 0x5C, 0x4A, 0xB3, 0x3B, 0xED,
0x5A, 0x07, 0xD9, 0x28, 0x26, 0xA4, 0x11, 0x59, 0xFF, 0x8E, 0xCA, 0xD5, 0x36, 0xDC, 0x21, 0x79,
0xCD, 0x9D, 0x85, 0xC6, 0x69, 0x37, 0x56, 0xC1, 0x42, 0x4E, 0x75, 0x80, 0x20, 0xFE, 0xE2, 0x9A,
0x04, 0x4E, 0x48, 0xF2, 0x86, 0x2B, 0xB6, 0xE4, 0x7D, 0xFA, 0x62, 0x4A, 0x5C, 0xBC, 0x49, 0x2F,
0x57, 0x17, 0x96, 0xB4, 0x68, 0xE3, 0xB9, 0x22, 0x2C, 0xA9, 0x9A, 0x1B, 0x94, 0x35, 0x53, 0x3B,
0xD8, 0x19, 0x3C, 0xA4, 0x80, 0x87, 0x02, 0x72, 0xE1, 0x78, 0xE2, 0x03, 0x8F, 0x50, 0x45, 0x38,
0xAA, 0xAD, 0xC1, 0x60, 0xA2, 0xBB, 0x6E, 0xA9, 0xA3, 0x1B, 0xA1, 0x48, 0xEE, 0x0A, 0x29, 0x90,
0x9E, 0x6B, 0x9C, 0x40, 0xD1, 0x60, 0xD0, 0x93, 0x01, 0xCE, 0xB9, 0xA5, 0x11, 0x42, 0x2A, 0xE7,
0x53, 0x01, 0xF5, 0x78, 0xAC, 0x47, 0xF2, 0x35, 0x26, 0x2F, 0xB4, 0x40, 0x9B, 0x3D, 0x40, 0x51,
0xAF, 0x92, 0xEA, 0x07, 0x7D, 0x40, 0x49, 0xBA, 0x56, 0x49, 0xF9, 0x84, 0x1F, 0x28, 0x19, 0x95,
0x02, 0xEA, 0xB8, 0x06, 0x28, 0x81, 0x7A, 0xE9, 0x03, 0x3A, 0xA0, 0x03, 0x4A, 0xE2, 0x66, 0x31,
0xD0, 0x2A, 0x35, 0x50, 0x72, 0xD6, 0x16, 0x5C, 0x7F, 0x4F, 0x2B, 0xEF, 0x2C, 0xE6, 0x66, 0x68,
0x3F, 0x6E, 0x13, 0x3E, 0xEE, 0x0F, 0xC2, 0x49, 0x63, 0xF8, 0x9E, 0x0D, 0xE7, 0x18, 0xF5, 0x80,
0x5D, 0xFF, 0xA5, 0x57, 0x26, 0xCE, 0x9D, 0xBD, 0xF4, 0x83, 0x91, 0xD1, 0xE0, 0xF8, 0xE5, 0x07,
0xAF, 0x93, 0xB4, 0xF5, 0xE6, 0xC9, 0xB5, 0x73, 0x23, 0x9E, 0xE1, 0xFC, 0x01, 0xB5, 0xCB, 0x66,
0xBC, 0x78, 0x9C, 0xED, 0xD9, 0xDB, 0x31, 0x43, 0x01, 0x14, 0x46, 0x61, 0xF7, 0x3B, 0x93, 0x0A,
0x48, 0x07, 0x74, 0x40, 0x07, 0x74, 0x40, 0x07, 0x74, 0x40, 0x07, 0xD2, 0x81, 0x74, 0x40, 0x07,
0x74, 0x40, 0x07, 0x74, 0x60, 0x22, 0x2E, 0x11, 0x97, 0xE3, 0x79, 0xAF, 0x27, 0x7B, 0xED, 0xCC,
0xF0, 0x70, 0x52, 0xC0, 0x3F, 0x67, 0xB6, 0xE4, 0x9B, 0x35, 0x4E, 0xD3, 0x54, 0x3F, 0x4B, 0xE5,
0x85, 0x76, 0xA2, 0x9D, 0x68, 0x27, 0xDA, 0x89, 0x76, 0xA2, 0x9D, 0xF8, 0xF3, 0x89, 0x29, 0xF7,
0x39, 0xFB, 0x17, 0x13, 0xBD, 0xFA, 0xC4, 0xA0, 0x3E, 0x31, 0x2A, 0x4F, 0x74, 0xEA, 0x7F, 0x91,
0x5E, 0x7D, 0xE2, 0xA9, 0x3E, 0x31, 0x2E, 0x4F, 0x74, 0xEB, 0xDF, 0xCE, 0x7E, 0x7D, 0x62, 0x58,
0x9F, 0xF8, 0x28, 0x4F, 0xEC, 0xD4, 0x7F, 0xA9, 0x37, 0xF5, 0x89, 0xE7, 0xFA, 0xC4, 0x67, 0x79,
0xE2, 0xA0, 0x29, 0x4F, 0xDC, 0xD5, 0x27, 0x5E, 0xEB, 0x13, 0x5F, 0x71, 0x62, 0x36, 0xBF, 0x70,
0x14, 0x17, 0xAE, 0xC5, 0x43, 0x3C, 0xC4, 0x89, 0x5D, 0x31, 0xF1, 0x16, 0x27, 0x56, 0xC5, 0xC4,
0x77, 0xF9, 0x14, 0x67, 0x71, 0xE1, 0x52, 0x3C, 0xC4, 0x20, 0x4E, 0x6C, 0x8B, 0x89, 0x51, 0x9C,
0x58, 0xC9, 0x2F, 0x74, 0xE2, 0x42, 0x33, 0x93, 0x9F, 0xE8, 0xC5, 0x85, 0x8B, 0xFC, 0x42, 0xE0,
0x5F, 0x9E, 0x62, 0x1C, 0x27, 0x96, 0xF3, 0x0B, 0xDD, 0xB8, 0xD0, 0x4C, 0xE7, 0x27, 0xFA, 0x71,
0xC1, 0x9C, 0x62, 0x18, 0x27, 0xB6, 0xC4, 0xC4, 0x47, 0x9C, 0x10, 0x56, 0x44, 0xFE, 0xD5, 0x29,
0x22, 0xFF, 0xCD, 0x79, 0x7E, 0x01, 0xFC, 0xAB, 0x53, 0x44, 0xFE, 0x9B, 0xC5, 0xFC, 0x02, 0xF8,
0x7F, 0x14, 0x0F, 0x01, 0xFE, 0x4F, 0xC5, 0x04, 0xF8, 0xDF, 0x10, 0x13, 0x30, 0x4F, 0x9C, 0x02,
0xFC, 0x9B, 0x53, 0x80, 0xFF, 0x63, 0x31, 0x01, 0xFE, 0x27, 0x70, 0x8A, 0x85, 0xFC, 0x02, 0xF8,
0xBF, 0x17, 0x0F, 0x01, 0xFE, 0x0F, 0xC5, 0x04, 0xF8, 0x5F, 0xCF, 0x2F, 0x90, 0xFF, 0xF9, 0xFC,
0x04, 0xF8, 0x37, 0xA7, 0x00, 0xFF, 0xFB, 0x62, 0x02, 0xFC, 0xAF, 0xE5, 0x17, 0xC8, 0xFF, 0x5C,
0x7E, 0xE2, 0x2A, 0x2E, 0xDC, 0xE6, 0x17, 0xC8, 0xBF, 0x39, 0x05, 0xF8, 0x17, 0x7D, 0xB4, 0x87,
0x53, 0x88, 0x3E, 0x02, 0xFF, 0x26, 0x15, 0xC1, 0xBF, 0x49, 0x45, 0x24, 0xAF, 0x38, 0x05, 0xF8,
0x37, 0x7D, 0x04, 0xFE, 0x4D, 0x2A, 0x82, 0x7F, 0xD3, 0x47, 0x30, 0x4F, 0xA4, 0x22, 0xF8, 0x37,
0xA7, 0x00, 0xFF, 0xA6, 0x8F, 0xC0, 0xBF, 0x38, 0x45, 0x07, 0xA7, 0x10, 0xA9, 0x08, 0xFE, 0x4D,
0x1F, 0x81, 0x7F, 0xD3, 0x47, 0xEF, 0x71, 0x42, 0xF4, 0x11, 0xF9, 0x17, 0xA9, 0x08, 0xFE, 0xCD,
0x29, 0xC0, 0xBF, 0x39, 0x05, 0xF8, 0xDF, 0xCC, 0x2F, 0x90, 0x7F, 0xD1, 0x47, 0xE0, 0xDF, 0xF4,
0x11, 0xF8, 0x37, 0xA9, 0x08, 0xFE, 0x45, 0x1F, 0x91, 0x7F, 0xD1, 0x47, 0xE0, 0xDF, 0x9C, 0x02,
0xFC, 0x9B, 0x54, 0x04, 0xFF, 0xA2, 0x8F, 0xC8, 0xBF, 0x38, 0x05, 0xF8, 0x37, 0x7D, 0x04, 0xFE,
0x4D, 0x2A, 0xC2, 0x3C, 0x71, 0x8A, 0x13, 0x9C, 0x42, 0xA4, 0x22, 0xF8, 0x37, 0x7D, 0x04, 0xFE,
0x45, 0x1F, 0x91, 0x7F, 0x91, 0x8A, 0xE4, 0x5F, 0xA4, 0x22, 0xF8, 0x37, 0xA7, 0x00, 0xFF, 0xA2,
0x8F, 0xC8, 0xBF, 0xE8, 0x23, 0xF2, 0x2F, 0x52, 0x11, 0xFC, 0x9B, 0x54, 0x04, 0xFF, 0xE2, 0x14,
0xE4, 0x5F, 0xF4, 0x11, 0xF8, 0x37, 0x7D, 0x04, 0xFE, 0x4D, 0x2A, 0x82, 0x7F, 0xD1, 0x47, 0xE4,
0x5F, 0x9C, 0x02, 0xFC, 0x9B, 0x53, 0xBC, 0xC4, 0x05, 0x93, 0x8A, 0xE0, 0x5F, 0xF4, 0x11, 0xF9,
0x17, 0xA9, 0x08, 0xFE, 0x4D, 0x1F, 0x81, 0x7F, 0xD3, 0x47, 0x30, 0x4F, 0x9C, 0x82, 0xFC, 0x8B,
0x54, 0x04, 0xFF, 0xE6, 0x14, 0xE0, 0x5F, 0x9C, 0x82, 0xE6, 0x89, 0x3E, 0x22, 0xFF, 0x22, 0x15,
0xC1, 0xBF, 0xE9, 0x23, 0xF0, 0x2F, 0x52, 0x71, 0x02, 0xA7, 0x20, 0xFF, 0xA2, 0x8F, 0xC0, 0xBF,
0x39, 0x05, 0xF8, 0x17, 0xA9, 0xC8, 0x7F, 0x78, 0x8B, 0x3E, 0x22, 0xFF, 0xA2, 0x8F, 0xC0, 0xBF,
0x49, 0x45, 0xF0, 0x2F, 0x52, 0x91, 0xFC, 0x8B, 0x53, 0x90, 0x7F, 0x71, 0x0A, 0xF0, 0x6F, 0xFA,
0x08, 0xFC, 0x8B, 0x54, 0x24, 0xFF, 0x22, 0x15, 0xC9, 0xBF, 0x48, 0x45, 0xF0, 0x6F, 0x4E, 0x01,
0xFE, 0x45, 0x1F, 0x91, 0x7F, 0x91, 0x8A, 0xE4, 0x5F, 0xA4, 0x22, 0xF8, 0x17, 0xA9, 0x48, 0xF3,
0xC4, 0x29, 0xC8, 0xBF, 0xE8, 0x23, 0xF0, 0x6F, 0xFA, 0x08, 0xFC, 0x8B, 0x54, 0x64, 0xF2, 0x8A,
0x54, 0xC4, 0xFB, 0x4E, 0xD3, 0x47, 0xE0, 0xDF, 0x9C, 0x02, 0xFC, 0x8B, 0x54, 0x24, 0xFF, 0xA2,
0x8F, 0xC8, 0xBF, 0x38, 0x05, 0xF8, 0x37, 0x7D, 0x84, 0xF7, 0x9D, 0xA2, 0x8F, 0xC8, 0xBF, 0x38,
0x05, 0xF9, 0x17, 0xA9, 0x08, 0xFE, 0xCD, 0x29, 0xC0, 0xBF, 0xE8, 0x23, 0xF2, 0x2F, 0xFA, 0x88,
0xFC, 0x8B, 0x54, 0x04, 0xFF, 0xA6, 0x8F, 0xC0, 0xBF, 0x38, 0x05, 0xF9, 0x17, 0xA7, 0x20, 0xFF,
0x22, 0x15, 0xF1, 0xBE, 0x53, 0x9C, 0x82, 0xFC, 0x8B, 0x54, 0x24, 0xFF, 0xA2, 0x8F, 0xC8, 0xBF,
0xE8, 0x23, 0xF0, 0x2F, 0x52, 0x91, 0xFC, 0x8B, 0x54, 0x24, 0xFF, 0xE2, 0x14, 0xE4, 0x5F, 0xF4,
0x11, 0xF8, 0x17, 0x7D, 0x44, 0xFE, 0x45, 0x2A, 0x92, 0x7F, 0x91, 0x8A, 0xE4, 0xFF, 0xB7, 0xA7,
0xF8, 0x01, 0xAD, 0x66, 0x16, 0xE2, 0x78, 0x9C, 0xDD, 0x5B, 0x49, 0x88, 0x5D, 0x45, 0x14, 0x7D,
0xBF, 0x87, 0x74, 0xF7, 0xEF, 0x4E, 0xF2, 0x13, 0xD4, 0x85, 0xD8, 0xFA, 0x05, 0x51, 0x50, 0xB0,
0x1B, 0x31, 0x20, 0xA2, 0x76, 0x67, 0xA3, 0x22, 0x68, 0x1A, 0x14, 0xC4, 0xB9, 0x91, 0x80, 0x4D,
0x22, 0xB6, 0x03, 0x88, 0x20, 0xA6, 0x55, 0x90, 0x40, 0x36, 0x71, 0xC0, 0x04, 0x24, 0xD8, 0x11,
0xCD, 0x4E, 0xF8, 0x82, 0x3B, 0x51, 0x7F, 0x74, 0xA1, 0x66, 0xD5, 0x11, 0x37, 0x4E, 0xF8, 0x9C,
0x07, 0x10, 0x9F, 0x46, 0x4D, 0x1C, 0x53, 0xBE, 0xE1, 0x0F, 0xEF, 0x9E, 0xBA, 0x55, 0x75, 0xAB,
0xDE, 0x5F, 0x79, 0x77, 0xBF, 0xEA, 0xBD, 0xF3, 0x6B, 0xB8, 0x75, 0x87, 0x73, 0xEB, 0x45, 0x91,
0x45, 0x9A, 0xDB, 0xF7, 0xBF, 0xF6, 0xE9, 0x4F, 0x27, 0x95, 0x4A, 0x3E, 0x7B, 0xFD, 0xB9, 0x87,
0xB6, 0xD4, 0x6C, 0xCF, 0x5A, 0x64, 0xEB, 0xBE, 0x1F, 0x15, 0xC8, 0x1B, 0x4B, 0xC3, 0xFE, 0x38,
0x0F, 0x7C, 0x8C, 0x30, 0x85, 0x1C, 0x38, 0xD7, 0x0F, 0xE7, 0xFE, 0xBF, 0x79, 0x9C, 0x4C, 0x9E,
0x3F, 0x55, 0x8E, 0x33, 0xFB, 0xA1, 0x19, 0x27, 0x93, 0xBB, 0xA5, 0x0B, 0xF6, 0xF8, 0x49, 0x3B,
0x90, 0x52, 0x6B, 0xA7, 0x89, 0x80, 0xDE, 0x71, 0xE1, 0x64, 0x72, 0xA9, 0x1B, 0xA7, 0xF1, 0x87,
0x04, 0x48, 0xA9, 0xDB, 0x5C, 0x40, 0xCD, 0x3F, 0x65, 0x40, 0x4A, 0xED, 0x72, 0x8C, 0xE8, 0x2F,
0x29, 0x90, 0x52, 0xF7, 0x0C, 0x62, 0x6A, 0xEE, 0x09, 0x7E, 0xEB, 0x03, 0xA4, 0xD4, 0x05, 0x46,
0xA0, 0xB7, 0xFD, 0x80, 0x94, 0x1A, 0x33, 0x00, 0xDD, 0xEB, 0x0B, 0xA4, 0xE2, 0x21, 0x7E, 0x91,
0x2C, 0x27, 0xC4, 0x24, 0xCB, 0x2C, 0xD2, 0xD7, 0xFE, 0x40, 0x4A, 0x4D, 0x0E, 0x64, 0x6E, 0x99,
0x70, 0xF3, 0x13, 0xAB, 0x24, 0x95, 0x2B, 0x34, 0xA0, 0x57, 0xC2, 0x80, 0x94, 0x1A, 0x41, 0xA4,
0x7F, 0x42, 0x91, 0xEE, 0x00, 0xA0, 0xB7, 0x42, 0x81, 0x94, 0x1A, 0x1D, 0xD0, 0x90, 0x94, 0xDA,
0x46, 0x80, 0x0E, 0x86, 0x03, 0x29, 0x45, 0xBC, 0x44, 0xE0, 0xC6, 0x15, 0x72, 0x61, 0x09, 0x68,
0xB1, 0x0A, 0x90, 0x8A, 0x4B, 0x48, 0xBF, 0x56, 0x42, 0x52, 0xF5, 0x3E, 0xD2, 0xBF, 0xD5, 0x90,
0xFA, 0xA7, 0xEF, 0x49, 0xE3, 0x33, 0xF1, 0x9E, 0xBB, 0x2E, 0xDE, 0x9C, 0xFA, 0xA4, 0x4D, 0x67,
0xDF, 0xF0, 0xE0, 0x11, 0xB3, 0xCB, 0xE9, 0x1D, 0x99, 0xDF, 0xF8, 0xFE, 0xE4, 0xE1, 0x53, 0xA8,
0xAA, 0xDC, 0x79, 0xC4, 0x80, 0x34, 0xD5, 0x7D, 0x82, 0xFF, 0xB3, 0x9D, 0xCC, 0xE1, 0x9C, 0xFF,
0xC8, 0x3A, 0xBD, 0x47, 0xB9, 0xCE, 0xF6, 0xA8, 0x8E, 0x93, 0x09, 0xEF, 0x56, 0x3B, 0x4E, 0xF9,
0x17, 0xA6, 0xEB, 0x11, 0xA3, 0xC3, 0x9E, 0xE7, 0xDC, 0xCF, 0x44, 0xD1, 0xC7, 0x74, 0xD9, 0xDC,
0x06, 0xE7, 0x12, 0x67, 0x8A, 0x1E, 0xBD, 0xE3, 0x76, 0x0B, 0x10, 0xEB, 0x14, 0x5B, 0x79, 0x87,
0xAE, 0x03, 0xAB, 0x56, 0xA0, 0x74, 0x82, 0xBA, 0xFE, 0xD5, 0xD8, 0x65, 0x8A, 0x9D, 0x81, 0x9B,
0xBE, 0x47, 0xE3, 0x59, 0xB3, 0xE6, 0x77, 0xEB, 0x2E, 0x20, 0xC6, 0x7B, 0x6C, 0xCC, 0x5A, 0x71,
0x5B, 0x57, 0xDC, 0x40, 0x51, 0x13, 0xE7, 0x97, 0x69, 0xD4, 0x2C, 0xC2, 0xAF, 0x13, 0x20, 0x45,
0xEF, 0xC3, 0x4B, 0xED, 0x48, 0x5F, 0x70, 0xB4, 0xCB, 0xBC, 0x34, 0xD0, 0xC8, 0xA6, 0x4B, 0xFE,
0x39, 0x34, 0x99, 0x7C, 0x3D, 0xC8, 0x17, 0xFA, 0x6B, 0x60, 0x9B, 0x5A, 0x32, 0x20, 0x6D, 0x51,
0x52, 0x67, 0x7C, 0x82, 0xB6, 0xAC, 0x17, 0x22, 0x45, 0xC7, 0xE9, 0x7B, 0xE9, 0xE6, 0x41, 0x5C,
0xA1, 0x39, 0x42, 0x93, 0x1C, 0xA6, 0xEF, 0xCD, 0x45, 0x51, 0xD8, 0xE4, 0xB4, 0x43, 0xB6, 0x82,
0x0D, 0x67, 0x89, 0x91, 0xC0, 0x1F, 0xB5, 0xA2, 0x05, 0x8A, 0x24, 0xD0, 0xEF, 0xAE, 0x1C, 0x23,
0x2F, 0xC6, 0x78, 0x84, 0xF8, 0x20, 0x8D, 0x15, 0xF0, 0xB6, 0x10, 0xA3, 0xAC, 0xC9, 0x81, 0xA2,
0x79, 0x8A, 0x34, 0x7C, 0x94, 0xFC, 0xDC, 0xEB, 0x81, 0x04, 0x7B, 0x35, 0x42, 0x55, 0x7C, 0xCE,
0x07, 0x89, 0xEA, 0xCF, 0xBA, 0x9F, 0xC9, 0xCF, 0x8D, 0x3E, 0x48, 0x54, 0xA7, 0xC7, 0xA9, 0x9D,
0x9B, 0x72, 0xBF, 0xDF, 0x17, 0xEA, 0x26, 0x27, 0xE8, 0x5E, 0x4E, 0xF8, 0x20, 0xD1, 0x41, 0xD4,
0x29, 0x92, 0xD0, 0x10, 0x14, 0x42, 0x17, 0xA6, 0x4E, 0x4D, 0x81, 0xC8, 0xCA, 0x75, 0x85, 0x6E,
0xD6, 0x24, 0x45, 0x32, 0x38, 0x5E, 0x5E, 0x8E, 0xDA, 0x90, 0xC4, 0x96, 0x20, 0x13, 0x6A, 0x0D,
0x26, 0x8F, 0x0D, 0x0A, 0x09, 0x56, 0xBC, 0xC2, 0xEC, 0xEA, 0x74, 0x2B, 0x2B, 0xAC, 0xF8, 0x04,
0xDD, 0xCA, 0x0A, 0x5A, 0x30, 0x46, 0x87, 0x58, 0x41, 0x33, 0x47, 0xA9, 0x55, 0xA9, 0x70, 0x5A,
0x86, 0xA9, 0xE3, 0xAC, 0x70, 0x82, 0x6B, 0x34, 0xA8, 0x0F, 0xB7, 0x2A, 0x09, 0x78, 0xC0, 0x70,
0x4B, 0xD7, 0x86, 0xDF, 0xE1, 0xD6, 0x77, 0x05, 0x2D, 0x5F, 0xB0, 0x47, 0x98, 0xC3, 0x75, 0x0B,
0xF6, 0x52, 0x1B, 0xB0, 0x21, 0xD8, 0x73, 0xD6, 0xF1, 0xF4, 0x04, 0x7B, 0xF3, 0x51, 0x8D, 0x27,
0x08, 0x8C, 0x30, 0x92, 0xB4, 0xA5, 0x41, 0x91, 0x02, 0xA3, 0x9E, 0x5C, 0x7D, 0x68, 0x9C, 0x1E,
0x18, 0x89, 0xE5, 0x49, 0x02, 0x5D, 0xF2, 0xC0, 0xE8, 0x30, 0xDF, 0x73, 0x60, 0x2F, 0xC2, 0x22,
0xD6, 0x61, 0x66, 0x9C, 0x32, 0x6B, 0x07, 0x4C, 0x45, 0xBB, 0x68, 0x85, 0x84, 0x26, 0x24, 0xB2,
0x9F, 0x61, 0xA7, 0x1C, 0x92, 0x6D, 0x8C, 0x17, 0xCD, 0xC8, 0x16, 0xF8, 0x67, 0x40, 0x3D, 0xC6,
0x00, 0x69, 0x35, 0xEF, 0xAC, 0xAC, 0x67, 0xD6, 0x70, 0x7A, 0xDE, 0x99, 0xE2, 0x78, 0xEF, 0x3F,
0xB0, 0xC7, 0x33, 0x7B, 0x2D, 0x59, 0xB5, 0x13, 0x1A, 0x94, 0x57, 0x46, 0x3D, 0xDD, 0xEF, 0x65,
0x48, 0x0C, 0x8F, 0x2C, 0x3F, 0x29, 0x9B, 0x47, 0x8E, 0xCA, 0x14, 0x33, 0x0F, 0x84, 0xCA, 0x62,
0xF9, 0x3E, 0x29, 0x1B, 0x42, 0x0D, 0x91, 0x81, 0x5F, 0x8D, 0xF7, 0xDC, 0xE8, 0x64, 0x68, 0x28,
0xBB, 0x66, 0xA1, 0x7B, 0x5C, 0x92, 0xA0, 0x1E, 0x1F, 0x77, 0xBF, 0xC3, 0xCB, 0x19, 0xDA, 0x5A,
0x3A, 0x0B, 0x1A, 0xBC, 0x30, 0xE7, 0xE1, 0x85, 0x20, 0xA0, 0x84, 0x53, 0x96, 0x6F, 0x42, 0x90,
0x4E, 0x67, 0x80, 0x38, 0x4D, 0x77, 0xCA, 0x65, 0x2C, 0x90, 0x67, 0x3D, 0x22, 0x93, 0x5B, 0x79,
0xA0, 0x54, 0xBE, 0xF3, 0x03, 0xB2, 0x15, 0x82, 0x9E, 0xF1, 0xC0, 0x71, 0x14, 0xA7, 0xE6, 0xDF,
0x13, 0xE2, 0x24, 0x3B, 0x9C, 0x05, 0x33, 0x21, 0x2B, 0xBD, 0xCD, 0x85, 0xF3, 0xFF, 0x46, 0x6A,
0xBE, 0x2B, 0x03, 0x52, 0xC9, 0x4D, 0x76, 0xA0, 0xFB, 0x3C, 0x58, 0xE9, 0x96, 0x2D, 0xD4, 0x7A,
0x51, 0x8E, 0x93, 0x4A, 0x6C, 0x0E, 0x6B, 0x5E, 0xF5, 0x02, 0x4A, 0x67, 0x68, 0x0A, 0x46, 0x9E,
0xF2, 0x04, 0x4A, 0xA1, 0xF8, 0x09, 0x2E, 0x04, 0xD8, 0xBA, 0x16, 0xA7, 0xE8, 0x21, 0x45, 0x37,
0xA5, 0xAE, 0x63, 0x90, 0x3E, 0x08, 0x01, 0x2A, 0x85, 0x04, 0xFD, 0xB9, 0x85, 0x01, 0x75, 0xA3,
0xB9, 0x92, 0x0C, 0xCC, 0xB7, 0x84, 0xD5, 0x01, 0x33, 0xC1, 0x5A, 0x60, 0x80, 0x0D, 0xEF, 0xCA,
0x34, 0x01, 0x32, 0x96, 0x93, 0x5E, 0x5E, 0xDA, 0xB2, 0x79, 0x53, 0xEA, 0xCD, 0x2F, 0xDA, 0xBE,
0xFB, 0x13, 0xD3, 0xA0, 0x08, 0x12, 0x5F, 0x71, 0x79, 0xF3, 0x2A, 0xA2, 0x2E, 0xCD, 0x67, 0xF9,
0x53, 0x59, 0x4E, 0xC3, 0x9B, 0x9C, 0x52, 0xAE, 0x9D, 0xA7, 0xEB, 0xDC, 0x21, 0xEE, 0xC1, 0xB2,
0x1B, 0x3E, 0xCC, 0xF4, 0xF3, 0x51, 0x1D, 0x5B, 0x23, 0x29, 0xF9, 0x61, 0xA6, 0xEE, 0x71, 0x0D,
0x87, 0x93, 0x0D, 0x8B, 0xF1, 0x64, 0x33, 0xFD, 0x3F, 0xD2, 0x3B, 0xCF, 0x37, 0x00, 0x45, 0x5C,
0x99, 0xBE, 0x1F, 0xB1, 0x22, 0xD9, 0x6E, 0xF4, 0xD2, 0x85, 0xE8, 0x1A, 0xD3, 0xB3, 0x2E, 0xDA,
0xE4, 0xF8, 0x72, 0x78, 0x57, 0x9A, 0xDA, 0x59, 0xEF, 0x4E, 0x4F, 0x2B, 0x02, 0xAD, 0x39, 0x72,
0x7D, 0x4D, 0xFB, 0xBA, 0xE9, 0xA5, 0x16, 0xAE, 0x3A, 0x19, 0x9F, 0xAF, 0xF0, 0x8D, 0x4E, 0x84,
0x88, 0x6A, 0x69, 0x9F, 0x5B, 0x26, 0x5A, 0x65, 0xA3, 0xA3, 0x9C, 0xD8, 0x2C, 0xA0, 0xD8, 0x50,
0x01, 0x0B, 0xEF, 0x87, 0x39, 0xA7, 0x28, 0x7D, 0x85, 0x7F, 0x2F, 0xAC, 0x14, 0xD6, 0xA7, 0x83,
0x6A, 0x40, 0xF9, 0x1E, 0x41, 0xAD, 0x4C, 0x96, 0xE6, 0xE3, 0x7E, 0xE7, 0x9B, 0x14, 0x56, 0x70,
0x01, 0x1B, 0xBB, 0x21, 0x6B, 0x03, 0x53, 0x21, 0xBC, 0x75, 0xC5, 0x70, 0x03, 0x30, 0x4E, 0x29,
0x87, 0xC1, 0xBC, 0x06, 0x16, 0x5C, 0x4C, 0x1B, 0xC1, 0x11, 0x8B, 0x34, 0xD5, 0xD0, 0xFD, 0x97,
0x41, 0x60, 0xA3, 0x46, 0x90, 0x29, 0x95, 0xD3, 0x6B, 0xA0, 0x3C, 0xE3, 0x78, 0x56, 0x74, 0x47,
0x68, 0x12, 0x50, 0xE8, 0x29, 0x2C, 0x98, 0xCA, 0xF8, 0x99, 0x5C, 0xE8, 0x9E, 0x6B, 0x55, 0xB7,
0x60, 0x9E, 0x6E, 0x0E, 0x4B, 0xAF, 0x1E, 0xC4, 0x2F, 0x5D, 0x96, 0x65, 0x24, 0xD7, 0xC4, 0x5B,
0x87, 0x5B, 0xB5, 0x17, 0x17, 0xCE, 0x83, 0xB4, 0xA7, 0xA4, 0x63, 0x1B, 0xA3, 0x1D, 0x8F, 0x1B,
0x8A, 0xF4, 0xBC, 0xC4, 0x68, 0x93, 0xE5, 0x40, 0x40, 0x1D, 0x25, 0xDA, 0x6F, 0xB9, 0xE0, 0x18,
0x28, 0x51, 0x10, 0xBB, 0x01, 0x7A, 0x02, 0xEB, 0x52, 0x3B, 0x38, 0x28, 0xA4, 0x21, 0x8A, 0x54,
0xA1, 0x3A, 0x39, 0x34, 0xB8, 0x3A, 0x27, 0xEE, 0x65, 0xF0, 0xEC, 0x2A, 0x20, 0x2D, 0x5A, 0x91,
0x2A, 0x68, 0x01, 0xAC, 0x78, 0xB8, 0x66, 0xAA, 0x21, 0x20, 0x9E, 0x82, 0x4F, 0x8B, 0xAA, 0x01,
0x72, 0xF0, 0x09, 0x56, 0xE8, 0x5A, 0x3C, 0xAC, 0x0A, 0x75, 0x09, 0x09, 0xEE, 0xA5, 0x98, 0xFC,
0x8F, 0xA2, 0xDF, 0xC9, 0x8B, 0x31, 0xDA, 0xA7, 0x60, 0xEB, 0xDB, 0x46, 0x9B, 0xE9, 0x8E, 0xC2,
0x7A, 0x42, 0xCD, 0xF6, 0x2A, 0x36, 0xC8, 0x8F, 0x0B, 0x1C, 0x96, 0x65, 0x2D, 0xA6, 0x12, 0xAB,
0x01, 0x28, 0xC1, 0x9C, 0xE6, 0xDF, 0xC5, 0x85, 0x29, 0x28, 0x89, 0x6C, 0xC4, 0x2D, 0x28, 0x65,
0x0E, 0x0E, 0x81, 0x04, 0x66, 0xBD, 0x16, 0x29, 0x48, 0xDD, 0x39, 0x46, 0xA7, 0x13, 0x9A, 0xAA,
0x4A, 0xB5, 0x1C, 0xA3, 0xDF, 0x51, 0x9D, 0xF1, 0x3D, 0x53, 0x86, 0x84, 0x3C, 0x63, 0x4D, 0x4F,
0xA4, 0x64, 0x7A, 0xC0, 0xBE, 0x05, 0x6D, 0xB2, 0xEA, 0xF2, 0x97, 0xF0, 0x52, 0xAE, 0xD1, 0x98,
0x45, 0x4A, 0xEA, 0xAF, 0x0D, 0xCC, 0x62, 0xF3, 0x53, 0xA6, 0x65, 0xD3, 0x82, 0x6A, 0x19, 0x06,
0xF6, 0xC5, 0x5D, 0x64, 0xDC, 0x3C, 0xC1, 0xA0, 0xF4, 0x0C, 0x3C, 0xDF, 0x71, 0x9D, 0xBE, 0xE0,
0x2E, 0x3B, 0x13, 0xD1, 0xA6, 0x51, 0xD8, 0xFF, 0x86, 0x86, 0xE4, 0x2A, 0x4C, 0xE9, 0x17, 0xF3,
0x3A, 0xF5, 0x35, 0x3D, 0x33, 0xB7, 0xCF, 0x6F, 0x56, 0x27, 0x20, 0x3A, 0x4A, 0xC8, 0xDC, 0xAA,
0xBC, 0xD6, 0x02, 0xD4, 0x60, 0x38, 0x81, 0x31, 0xD3, 0x60, 0xAD, 0xC9, 0x39, 0x43, 0xE6, 0x74,
0xDD, 0xA4, 0xA6, 0x1C, 0x99, 0xDC, 0x62, 0xC0, 0x69, 0x7E, 0xCF, 0x3C, 0xDC, 0xB3, 0xB4, 0x2C,
0x8B, 0xB5, 0x8B, 0xCD, 0x16, 0x16, 0x58, 0x36, 0xAF, 0x17, 0x31, 0x73, 0xB4, 0x4A, 0xBA, 0x83,
0x97, 0xE8, 0x4B, 0x74, 0x88, 0x7D, 0xB2, 0x9F, 0xA2, 0x30, 0xB7, 0x46, 0x73, 0x69, 0x5F, 0x4D,
0x59, 0xA3, 0x7D, 0x06, 0x2E, 0xB7, 0xB4, 0xD5, 0x66, 0x46, 0x2C, 0x63, 0xB2, 0x6A, 0x39, 0x93,
0xB5, 0xDF, 0xC4, 0x64, 0x91, 0x74, 0x20, 0xF8, 0x6A, 0x7C, 0x21, 0xA5, 0x15, 0x65, 0x77, 0x4F,
0x2C, 0x24, 0x6B, 0xAA, 0x74, 0x59, 0x9B, 0x18, 0xB4, 0x50, 0x5E, 0x34, 0x13, 0xF0, 0x21, 0xDE,
0xE5, 0x9F, 0xBE, 0x40, 0xFA, 0x15, 0x5E, 0x09, 0x8C, 0x91, 0xCF, 0x0B, 0xBE, 0x69, 0x3F, 0x0D,
0x40, 0xC1, 0x83, 0xD2, 0x86, 0x14, 0x3C, 0x28, 0xAD, 0x38, 0x19, 0x7A, 0xFF, 0x9F, 0x75, 0xFE,
0x86, 0x3B, 0xF2, 0x76, 0x61, 0x9D, 0xA3, 0x76, 0x43, 0x59, 0x20, 0x06, 0x52, 0xC0, 0xFF, 0x93,
0x0B, 0xC3, 0x77, 0x40, 0x01, 0x35, 0x53, 0xA3, 0xE3, 0xF7, 0xF9, 0x82, 0x2B, 0x93, 0xCB, 0x4D,
0x40, 0xBE, 0x25, 0x17, 0xAB, 0x2F, 0xF3, 0x29, 0x27, 0xB4, 0xEC, 0xB4, 0x90, 0xBC, 0xA2, 0xB4,
0xE6, 0x8A, 0x92, 0x9F, 0x96, 0x02, 0xB9, 0xAF, 0x37, 0x3D, 0x26, 0x02, 0x6A, 0x4B, 0xEE, 0x49,
0x2D, 0x0A, 0x34, 0x74, 0x55, 0x46, 0x9D, 0xCD, 0xFE, 0xE0, 0x02, 0xDA, 0x29, 0xC2, 0xC9, 0xE4,
0x25, 0xAB, 0x36, 0x08, 0xBF, 0x9C, 0xEC, 0x0C, 0xCB, 0x5C, 0xAA, 0x4E, 0x6E, 0xF6, 0xFC, 0xFC,
0x75, 0x2B, 0x8F, 0x15, 0xEF, 0xF0, 0xB8, 0xBB, 0xD7, 0x95, 0xE6, 0x13, 0xF8, 0xE9, 0x6B, 0x72,
0xE0, 0xCA, 0xD0, 0xCF, 0x71, 0x1B, 0xD7, 0xEF, 0xEE, 0x7F, 0xD5, 0xBB, 0x74, 0x8E, 0xFD, 0xE1,
0xFF, 0x00, 0x7A, 0xCF, 0x0B, 0xB0, 0x78, 0x9C, 0xDD, 0x5A, 0x3D, 0x6C, 0x14, 0x57, 0x10, 0x5E,
0xFF, 0x04, 0xDB, 0x60, 0x9F, 0x2F, 0x11, 0x1D, 0x02, 0x3B, 0x4A, 0x95, 0x22, 0xE0, 0x2E, 0x0D,
0x02, 0x4B, 0x51, 0x2C, 0x52, 0xD9, 0x45, 0x2A, 0x04, 0x32, 0x69, 0x48, 0x11, 0x25, 0x17, 0x4B,
0x41, 0x88, 0xCA, 0xB4, 0xD0, 0x38, 0x0D, 0x88, 0xEE, 0x5C, 0xA5, 0x49, 0xE1, 0x44, 0xCA, 0x8F,
0x28, 0xD0, 0x45, 0x54, 0xA0, 0x14, 0x20, 0x51, 0xD0, 0x71, 0x28, 0x8A, 0xA0, 0x21, 0x5C, 0x42,
0x12, 0xE7, 0xDF, 0x2F, 0xB7, 0x7B, 0xC7, 0x79, 0xE7, 0x9B, 0x79, 0x6F, 0x67, 0x46, 0x57, 0xF1,
0x55, 0xF6, 0xDE, 0xED, 0x77, 0xEF, 0xBD, 0xFD, 0xBE, 0x79, 0x33, 0xF3, 0x36, 0xCB, 0x52, 0x58,
0x38, 0x77, 0xED, 0xFB, 0x9F, 0x76, 0x42, 0x78, 0xFA, 0xE0, 0xF3, 0x4B, 0x4B, 0xA3, 0xC9, 0xAF,
0xA6, 0x30, 0x7F, 0xF5, 0x49, 0x20, 0xB8, 0x71, 0x62, 0xC4, 0xC3, 0xB3, 0x78, 0x2B, 0x70, 0x74,
0x3E, 0x30, 0x0F, 0xAC, 0xFE, 0x8D, 0xC0, 0x53, 0x70, 0x9D, 0xB4, 0x11, 0xAD, 0xFD, 0x1B, 0x21,
0xEA, 0x62, 0xEB, 0x25, 0x03, 0xD1, 0x57, 0x71, 0x9E, 0x1C, 0xAF, 0xAB, 0x67, 0xF6, 0x38, 0x4D,
0x14, 0xC2, 0x29, 0x25, 0xD1, 0x5F, 0x55, 0x44, 0x21, 0x7C, 0xA8, 0x21, 0x9A, 0x57, 0x10, 0x85,
0xF0, 0x91, 0x82, 0xE9, 0x4F, 0x0D, 0x51, 0x08, 0xA7, 0x2B, 0x89, 0x1E, 0xE9, 0x88, 0x42, 0x38,
0x5A, 0x41, 0x74, 0x4F, 0x4B, 0x14, 0xC2, 0x54, 0x92, 0xE8, 0xA2, 0x9E, 0x28, 0x74, 0xC6, 0x13,
0x44, 0x0B, 0xFF, 0x19, 0x98, 0x42, 0x33, 0xC1, 0xF4, 0x87, 0x85, 0x28, 0x84, 0x37, 0xA2, 0x44,
0x5F, 0xDA, 0x88, 0x42, 0xD8, 0x13, 0x9B, 0xDB, 0x8E, 0x95, 0x29, 0x36, 0xBF, 0xDF, 0xAC, 0x44,
0x21, 0xEC, 0x13, 0x89, 0xCE, 0xD8, 0x89, 0x42, 0x5B, 0x0C, 0x7D, 0x4A, 0x71, 0x53, 0x1C, 0x16,
0x88, 0x2C, 0x52, 0xDA, 0x45, 0x47, 0x88, 0xA1, 0x2A, 0xE3, 0x6A, 0x06, 0xE5, 0x1B, 0x92, 0x34,
0x28, 0xA3, 0x28, 0x77, 0x71, 0x10, 0x88, 0x56, 0xBC, 0x44, 0xE1, 0x0E, 0x30, 0xFD, 0xEA, 0x66,
0x02, 0x4D, 0xD5, 0xCD, 0xF2, 0xDE, 0xC5, 0x3A, 0x61, 0xFA, 0x22, 0xF6, 0xB5, 0xF6, 0xE5, 0xA5,
0xD7, 0xBA, 0xEA, 0x7B, 0xF9, 0xAD, 0x73, 0xB7, 0xA3, 0x54, 0x24, 0xBA, 0x44, 0x54, 0xD9, 0x7A,
0xB3, 0xF4, 0x9D, 0xF9, 0x2B, 0x91, 0x98, 0x73, 0xA8, 0xF4, 0xA5, 0x45, 0xF1, 0x1B, 0x9D, 0x77,
0x60, 0x31, 0x23, 0x1B, 0x73, 0xAB, 0xF4, 0x95, 0xBB, 0xE2, 0x17, 0x84, 0x98, 0xB8, 0x26, 0x0E,
0xAB, 0x14, 0x5C, 0x24, 0x7D, 0x37, 0xC5, 0x5C, 0x62, 0x51, 0xDA, 0xE6, 0x8F, 0x24, 0x27, 0xD7,
0x8C, 0x24, 0x38, 0x12, 0xD5, 0xEE, 0xF4, 0x84, 0xC9, 0xB5, 0xA2, 0xD9, 0xCD, 0x8A, 0x20, 0x98,
0x41, 0xCE, 0xB1, 0xCD, 0x3E, 0xEA, 0x24, 0xF2, 0x91, 0x4F, 0x39, 0x53, 0xAD, 0xFF, 0x91, 0x20,
0xCB, 0x03, 0x71, 0xA2, 0x2C, 0xFB, 0x91, 0x7D, 0xFD, 0xB9, 0x38, 0x79, 0x18, 0x58, 0x4F, 0x11,
0x65, 0xF5, 0x7F, 0xD8, 0x0D, 0xFD, 0x45, 0xFD, 0x85, 0x7D, 0x90, 0xDA, 0x13, 0xC5, 0x9F, 0xEE,
0xEF, 0xC7, 0x4C, 0xE0, 0x52, 0x48, 0x25, 0x60, 0x0B, 0x3B, 0xD7, 0x1B, 0x2C, 0x5E, 0x96, 0x22,
0x2A, 0x05, 0x8B, 0x41, 0x1B, 0xC5, 0xE5, 0x8F, 0xCD, 0x43, 0xCA, 0xB2, 0xDF, 0xF1, 0xC7, 0x8B,
0xAB, 0x0F, 0x91, 0x49, 0x91, 0x28, 0xB3, 0x5F, 0x2F, 0x0C, 0x83, 0x1B, 0xE6, 0x72, 0x35, 0x11,
0xF7, 0xD7, 0x74, 0x7E, 0x11, 0x9F, 0xE9, 0x84, 0x86, 0xE9, 0x3B, 0xB8, 0xE9, 0x78, 0xC6, 0x17,
0xBC, 0x55, 0xC9, 0x92, 0x03, 0xD5, 0xDC, 0x14, 0xA6, 0x7C, 0xA8, 0x92, 0xA5, 0x00, 0x08, 0x21,
0x5F, 0x72, 0x0C, 0xBC, 0xCA, 0x0A, 0x00, 0x6F, 0x1B, 0x63, 0x0A, 0xD7, 0x4D, 0xAE, 0x1B, 0x8B,
0x81, 0x69, 0x92, 0x49, 0xE3, 0x48, 0x35, 0x49, 0x0F, 0xF0, 0xF4, 0x66, 0xB2, 0xEC, 0x6F, 0x7A,
0x65, 0xAF, 0x96, 0x09, 0xE6, 0xD2, 0x1D, 0x01, 0x3C, 0x04, 0x75, 0xFD, 0x06, 0x61, 0xAA, 0x81,
0xF3, 0xD5, 0x2E, 0x13, 0x5B, 0xA8, 0x2D, 0x34, 0xA3, 0x4A, 0xE0, 0x3D, 0x50, 0x45, 0xB7, 0x71,
0x90, 0xB5, 0x6A, 0x86, 0xE7, 0x80, 0x47, 0x35, 0x02, 0xB2, 0x9F, 0xD4, 0x33, 0xFD, 0x4C, 0xEF,
0x1C, 0xC7, 0xFF, 0xF5, 0x4C, 0xA0, 0xCD, 0x3D, 0xF0, 0x30, 0xF5, 0x44, 0x98, 0x2B, 0x4F, 0xD1,
0x98, 0xA2, 0x7F, 0x74, 0xDD, 0x42, 0x80, 0x32, 0x4D, 0x53, 0x27, 0xA6, 0x37, 0x15, 0x00, 0x65,
0xAA, 0xD1, 0xED, 0xC0, 0x20, 0x82, 0x2C, 0xA3, 0xFB, 0xFA, 0x2C, 0xB5, 0xCF, 0x9C, 0x85, 0x09,
0x6E, 0xA5, 0xFA, 0x9A, 0xB5, 0x30, 0xD1, 0x74, 0xF9, 0x38, 0x1D, 0xE2, 0x8C, 0x85, 0x89, 0x4A,
0x73, 0x99, 0xA6, 0x56, 0x72, 0x6D, 0x14, 0x01, 0xCD, 0x97, 0x57, 0x69, 0x28, 0x50, 0xC7, 0x94,
0x1C, 0xCF, 0xC8, 0xAD, 0x0D, 0xCA, 0x94, 0xAE, 0xB7, 0x01, 0x54, 0xD4, 0x0D, 0xF2, 0x9F, 0xC5,
0x76, 0x68, 0xBC, 0xF5, 0x17, 0x9B, 0x69, 0x78, 0x2B, 0x3E, 0x3C, 0x15, 0x0C, 0x4F, 0x99, 0xC3,
0x73, 0xCB, 0xF0, 0x1C, 0x4C, 0x43, 0x83, 0x7A, 0x2F, 0xCF, 0x01, 0x51, 0x65, 0x78, 0x91, 0x8E,
0x46, 0xDF, 0x0D, 0x0B, 0x13, 0xB9, 0x33, 0xD4, 0x86, 0xB6, 0x23, 0xEC, 0xF3, 0xEF, 0x52, 0x90,
0x0C, 0x4E, 0xF9, 0x77, 0x4E, 0xD8, 0xBD, 0x27, 0xE0, 0x7F, 0x83, 0x5D, 0x60, 0x36, 0xE3, 0xFE,
0x0C, 0x03, 0x72, 0xD6, 0x11, 0xD8, 0x93, 0x57, 0xF5, 0x4C, 0x54, 0x04, 0x1D, 0x4C, 0xA8, 0xB0,
0x4B, 0x12, 0x07, 0x3C, 0xBA, 0x16, 0xCB, 0x0E, 0xC7, 0xB4, 0x4C, 0x9B, 0xF4, 0xBE, 0x75, 0x56,
0x6C, 0xA8, 0xA3, 0x01, 0x8D, 0x29, 0x79, 0xB9, 0xB1, 0xCD, 0xAE, 0xE8, 0x00, 0x39, 0xF3, 0x2C,
0x7B, 0x98, 0xDA, 0x85, 0x82, 0x65, 0xCA, 0xE7, 0x82, 0x55, 0x51, 0xAC, 0x6F, 0x0A, 0x10, 0x6E,
0xC3, 0x0A, 0x48, 0x19, 0x58, 0xB0, 0x1B, 0x37, 0xCA, 0x0B, 0x10, 0xDD, 0xF4, 0xF0, 0xAE, 0x76,
0x7E, 0x11, 0x1B, 0x25, 0xAA, 0x9D, 0x0A, 0x1B, 0x28, 0x45, 0x38, 0xC2, 0x92, 0x5D, 0x25, 0x73,
0x78, 0x72, 0xBD, 0x47, 0x0E, 0xD1, 0x40, 0x25, 0x4E, 0xD6, 0x7B, 0xA8, 0x89, 0x57, 0x15, 0x55,
0x3E, 0x6B, 0x3D, 0x14, 0x4B, 0xE2, 0xE8, 0x3C, 0xF0, 0xB6, 0xF5, 0xA8, 0x38, 0xE7, 0x70, 0xCC,
0x3C, 0xA4, 0xFE, 0x03, 0x7F, 0x86, 0xD7, 0xAB, 0x22, 0x27, 0xEF, 0x40, 0x35, 0x7A, 0x1F, 0x6C,
0xB2, 0x0F, 0xCC, 0x5D, 0xA3, 0xFE, 0x8E, 0xCB, 0x16, 0xCA, 0xDC, 0xC9, 0x1A, 0x04, 0x6D, 0xDE,
0x17, 0x35, 0x76, 0xD7, 0x06, 0x35, 0x2F, 0xEB, 0xD1, 0x58, 0x3B, 0x7E, 0x83, 0x6D, 0x52, 0x6A,
0x69, 0x5B, 0xBA, 0x90, 0xA5, 0x24, 0x80, 0x2F, 0xA1, 0xA9, 0x33, 0x5A, 0x4A, 0x96, 0x78, 0xA7,
0x2E, 0x58, 0xBA, 0xB5, 0xA5, 0x0E, 0x8A, 0xDC, 0xB1, 0xD7, 0x76, 0x90, 0x7B, 0x21, 0xA5, 0x0F,
0x26, 0xF3, 0xFE, 0xB0, 0x54, 0x5D, 0x6D, 0x12, 0x3D, 0xC4, 0x66, 0x74, 0xF1, 0x73, 0x8A, 0x4E,
0x3B, 0xC9, 0x29, 0x31, 0x04, 0xDA, 0x40, 0xC4, 0x87, 0xCD, 0x40, 0x0B, 0x68, 0xBC, 0x66, 0xCD,
0x40, 0x03, 0x20, 0xA5, 0x74, 0x1E, 0x26, 0xE5, 0x80, 0x6D, 0x9B, 0x07, 0x04, 0x35, 0x50, 0xC2,
0x92, 0xCE, 0x55, 0x60, 0x07, 0x8B, 0xD1, 0x23, 0x97, 0x2A, 0xF0, 0x66, 0x63, 0x44, 0x9D, 0x95,
0xE0, 0xDB, 0xBF, 0xF3, 0xDC, 0x4D, 0xDA, 0xB3, 0x7D, 0x07, 0x6F, 0x52, 0x9A, 0xB4, 0xE8, 0x3A,
0xE6, 0x12, 0xB3, 0xE5, 0x9B, 0x0E, 0xA2, 0x8E, 0x44, 0xE4, 0x92, 0x67, 0x24, 0x8B, 0x70, 0xCC,
0x2F, 0x56, 0xEF, 0x9A, 0x95, 0xDE, 0x89, 0xBE, 0x55, 0x63, 0x78, 0x53, 0xA1, 0x40, 0x22, 0x45,
0x52, 0xBF, 0x3D, 0xD1, 0x43, 0xA2, 0x98, 0xAF, 0x9B, 0x0E, 0xBD, 0xE3, 0x93, 0xB3, 0x52, 0xA5,
0xAB, 0xDD, 0xFA, 0x7D, 0x3D, 0x53, 0x55, 0x11, 0xF7, 0xB5, 0x96, 0xA8, 0x5D, 0x41, 0x94, 0x65,
0xEF, 0x25, 0x5E, 0x35, 0x2A, 0x43, 0x51, 0x9A, 0xD4, 0x3F, 0x53, 0x31, 0xA9, 0x8E, 0x66, 0x16,
0xBE, 0x05, 0xBD, 0x0B, 0xDB, 0xA6, 0xB6, 0x92, 0xAF, 0x7F, 0x72, 0x7D, 0x40, 0x76, 0xE7, 0xC2,
0x7E, 0x61, 0xC7, 0x57, 0x1E, 0xCD, 0x14, 0x78, 0xF5, 0xDD, 0xB3, 0xE7, 0xCF, 0xBF, 0xFF, 0xF6,
0x2B, 0xF9, 0xDF, 0x7C, 0x4B, 0x54, 0x57, 0x95, 0x00, 0x96, 0x3A, 0x9B, 0xDA, 0xCD, 0x04, 0x28,
0x59, 0x53, 0xB3, 0x8A, 0x00, 0xA4, 0x91, 0x74, 0x4A, 0x12, 0x98, 0xA9, 0xAA, 0xEB, 0x5C, 0x06,
0x5C, 0x71, 0x95, 0x98, 0x24, 0x60, 0x62, 0x64, 0x69, 0x0B, 0x51, 0x60, 0xB2, 0x66, 0x11, 0x13,
0x05, 0x6E, 0xD1, 0x5E, 0x31, 0xB1, 0x04, 0xCB, 0x2F, 0x26, 0x7C, 0x0D, 0xC5, 0x2D, 0x26, 0x3C,
0x21, 0xF5, 0x8B, 0x09, 0x73, 0x22, 0xBF, 0x98, 0xD0, 0x29, 0xCA, 0x4E, 0x07, 0x07, 0xBE, 0xA9,
0xB1, 0xE5, 0x1E, 0xD2, 0x0F, 0xC0, 0x64, 0xEA, 0x0F, 0x13, 0x60, 0x5C, 0x77, 0x8B, 0x09, 0xCD,
0xDB, 0x70, 0x0F, 0x09, 0xCD, 0x6B, 0x6A, 0xC8, 0x97, 0x21, 0x36, 0x76, 0x5C, 0x40, 0xF3, 0x9A,
0x7A, 0xDF, 0x04, 0x68, 0x5E, 0xB7, 0x98, 0xD0, 0xBC, 0x7E, 0x31, 0xA1, 0x79, 0xDD, 0x62, 0x62,
0x2F, 0xEB, 0xB8, 0xDF, 0xD9, 0x46, 0xF3, 0x1A, 0x5A, 0xC3, 0x00, 0x34, 0xAF, 0xE9, 0x9C, 0xA8,
0x0C, 0x34, 0xAF, 0x5F, 0x4C, 0x68, 0x5E, 0xBF, 0x98, 0xD0, 0xBC, 0x96, 0x77, 0xBE, 0x09, 0xD0,
0xBC, 0xA9, 0x57, 0x73, 0xD3, 0x40, 0xF3, 0x4E, 0x7B, 0x89, 0x58, 0x4B, 0xC2, 0x2D, 0x26, 0x34,
0xAF, 0x5F, 0x4C, 0x68, 0x5E, 0xB7, 0x98, 0xD0, 0xBC, 0xFA, 0x03, 0x0B, 0x04, 0x9A, 0x57, 0xD1,
0xC8, 0x95, 0xC1, 0xCC, 0x6B, 0x38, 0x6C, 0xA2, 0x40, 0xF3, 0x9A, 0x0E, 0xE5, 0x08, 0xD0, 0xBC,
0x6E, 0x31, 0xA1, 0x79, 0xFD, 0x69, 0x05, 0x9A, 0xD7, 0x74, 0x76, 0x49, 0xE0, 0x3A, 0x61, 0x90,
0x80, 0xE6, 0xF5, 0x8B, 0x09, 0xFB, 0xE9, 0xEE, 0x1C, 0x95, 0x99, 0xD7, 0x2D, 0x26, 0xF1, 0x48,
0xC5, 0x05, 0x34, 0xAF, 0x3B, 0x47, 0x45, 0xF3, 0xFA, 0xC5, 0x84, 0xE6, 0x75, 0x8B, 0x89, 0x99,
0xD7, 0x5D, 0xF0, 0xE0, 0xF9, 0x9C, 0xBF, 0xE0, 0x41, 0xF3, 0xBA, 0xC5, 0xC4, 0x5E, 0x70, 0x76,
0xE7, 0xA8, 0x68, 0x5E, 0x7F, 0xC1, 0x83, 0xE6, 0x75, 0x8B, 0x09, 0xCD, 0xEB, 0x17, 0x13, 0x9A,
0xD7, 0x5D, 0xF0, 0x30, 0xF3, 0xBA, 0x73, 0x54, 0x34, 0xAF, 0x3F, 0x47, 0x45, 0xF3, 0xBA, 0x73,
0x54, 0x76, 0xA8, 0xE0, 0x16, 0x13, 0x9A, 0xD7, 0x5D, 0xF0, 0x30, 0xF3, 0xBA, 0x0B, 0x1E, 0x34,
0xAF, 0x3F, 0x47, 0x45, 0xF3, 0xBA, 0x73, 0x54, 0x66, 0x5E, 0xB7, 0x98, 0xF0, 0x50, 0xD7, 0x2F,
0x26, 0x34, 0xAF, 0x5B, 0x4C, 0xEC, 0x68, 0x55, 0x9B, 0xA3, 0xFE, 0x0F, 0xB5, 0x7A, 0x66, 0x14,
};
// GlyphProps[width, height, advance_x, left, top, compressed_size, data_offset, code_point]
const EpdGlyph MartianMono120_Glyphs[] = {
{ 0, 0, 188, 0, 0, 8, 0 }, // ' '
{ 158, 208, 188, 15, 204, 1730, 8 }, // '0'
{ 143, 200, 188, 27, 200, 392, 1738 }, // '1'
{ 143, 204, 188, 23, 204, 1269, 2130 }, // '2'
{ 146, 208, 188, 21, 204, 1654, 3399 }, // '3'
{ 161, 200, 188, 13, 200, 649, 5053 }, // '4'
{ 144, 204, 188, 24, 200, 1148, 5702 }, // '5'
{ 148, 204, 188, 20, 200, 1471, 6850 }, // '6'
{ 133, 200, 188, 25, 200, 757, 8321 }, // '7'
{ 147, 208, 188, 20, 204, 1792, 9078 }, // '8'
{ 148, 204, 188, 20, 204, 1514, 10870 }, // '9'
};
const EpdUnicodeInterval MartianMono120_Intervals[] = {
{ 0x20, 0x20, 0x0 },
{ 0x30, 0x39, 0x1 },
};
const EpdFont MartianMono120 = {
MartianMono120_Bitmaps, // (*bitmap) Glyph bitmap pointer, all concatenated together
MartianMono120_Glyphs, // glyphs Glyph array
MartianMono120_Intervals, // intervals Valid unicode intervals for this font
2, // interval_count Number of unicode intervals.intervals
1, // compressed Does this font use compressed glyph bitmaps?
300, // advance_y Newline distance (y axis)
250, // ascender Maximal height of a glyph above the base line
-50, // descender Maximal height of a glyph below the base line
};
/*
Included intervals
( 32, 32), ie. ' ' - ' '
( 48, 57), ie. '0' - '9'
*/

View File

@@ -2,7 +2,7 @@
#include "epdiy.h"
/*
Created with
.pio/libdeps/esp32dev/epdiy/scripts/fontconvert.py --compress MartianMono200 200 static/MartianMono-VariableFont_wdth,wght.ttf --string 0123456789
lib/epdiy/scripts/fontconvert.py --compress MartianMono200 200 static/MartianMono-VariableFont_wdth,wght.ttf --string 0123456789
As 'MartianMono200' with available 11 characters
0123456789
*/
@@ -1474,7 +1474,7 @@ const EpdFont MartianMono200 = {
MartianMono200_Intervals, // intervals Valid unicode intervals for this font
2, // interval_count Number of unicode intervals.intervals
1, // compressed Does this font use compressed glyph bitmaps?
0, // advance_y Newline distance (y axis)
500, // advance_y Newline distance (y axis)
417, // ascender Maximal height of a glyph above the base line
-84, // descender Maximal height of a glyph below the base line
};

File diff suppressed because it is too large Load Diff

11
lib/epdiy/.clang-format Normal file
View File

@@ -0,0 +1,11 @@
BasedOnStyle: chromium
IndentWidth: 4
ColumnLimit: 100
AlignAfterOpenBracket: BlockIndent
IncludeBlocks: Preserve
BreakBeforeBinaryOperators: All
Cpp11BracedListStyle: false
AllowAllParametersOfDeclarationOnNextLine: true
BinPackArguments: false
BinPackParameters: false
SortIncludes: false

28
lib/epdiy/.gitignore vendored Normal file
View File

@@ -0,0 +1,28 @@
.pio
.vscode
build/
build.clang
sdkconfig.old
sdkconfig
**/build/
.ccls-cache
doc/source/xml/
compile_commands.json
examples/mpd_status/main/wifi_config.h
/.idea/
*.kicad_pcb-bak
*.sch-bak
eink_*.h
eink_*.json
fp-info-cache
.cache
__pycache__
examples/weather/components
sdkconfig
managed_components/
epaper-breakout-backups/
dependencies.lock
ED*.h
ES*.h
examples/private_*/
*.code-workspace

View File

@@ -0,0 +1,23 @@
# .readthedocs.yml
# Read the Docs configuration file
# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
# Required
version: 2
# Build documentation in the docs/ directory with Sphinx
sphinx:
configuration: doc/source/conf.py
# Optionally build your docs in additional formats such as PDF and ePub
formats: all
build:
os: ubuntu-22.04
tools:
python: "3.11"
# Optionally set the version of Python and requirements required to build your docs
python:
install:
- requirements: doc/requirements.txt

45
lib/epdiy/CMakeLists.txt Normal file
View File

@@ -0,0 +1,45 @@
set(app_sources "src/epdiy.c"
"src/render.c"
"src/output_lcd/render_lcd.c"
"src/output_lcd/lcd_driver.c"
"src/output_i2s/render_i2s.c"
"src/output_i2s/rmt_pulse.c"
"src/output_i2s/i2s_data_bus.c"
"src/output_common/lut.c"
"src/output_common/lut.S"
"src/output_common/line_queue.c"
"src/output_common/render_context.c"
"src/output_common/render_method.c"
"src/font.c"
"src/displays.c"
"src/diff.S"
"src/board_specific.c"
"src/builtin_waveforms.c"
"src/highlevel.c"
"src/board/tps65185.c"
"src/board/pca9555.c"
"src/board/epd_board.c"
"src/board/epd_board_common.c"
"src/board/epd_board_lilygo_t5_47.c"
"src/board/lilygo_board_s3.c"
"src/board/epd_board_v2_v3.c"
"src/board/epd_board_v4.c"
"src/board/epd_board_v5.c"
"src/board/epd_board_v6.c"
"src/board/epd_board_v7.c"
"src/board/epd_board_v7_raw.c"
"src/board/epd_board_v7_103.c" # Experimental board (not ready yet)
)
# Can also use IDF_VER for the full esp-idf version string but that is harder to parse. i.e. v4.1.1, v5.0-beta1, etc
if (${IDF_VERSION_MAJOR} GREATER 4)
idf_component_register(SRCS ${app_sources} INCLUDE_DIRS "src/" REQUIRES driver esp_timer esp_adc esp_lcd)
else()
idf_component_register(SRCS ${app_sources} INCLUDE_DIRS "src/" REQUIRES esp_adc_cal esp_timer esp_lcd)
endif()
# formatting specifiers maybe incompatible between idf versions because of different int definitions
component_compile_options(-Wno-error=format= -Wno-format)
set_source_files_properties("src/output_common/lut.c" PROPERTIES COMPILE_OPTIONS -mno-fix-esp32-psram-cache-issue)

165
lib/epdiy/LICENSE Normal file
View File

@@ -0,0 +1,165 @@
GNU LESSER GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
This version of the GNU Lesser General Public License incorporates
the terms and conditions of version 3 of the GNU General Public
License, supplemented by the additional permissions listed below.
0. Additional Definitions.
As used herein, "this License" refers to version 3 of the GNU Lesser
General Public License, and the "GNU GPL" refers to version 3 of the GNU
General Public License.
"The Library" refers to a covered work governed by this License,
other than an Application or a Combined Work as defined below.
An "Application" is any work that makes use of an interface provided
by the Library, but which is not otherwise based on the Library.
Defining a subclass of a class defined by the Library is deemed a mode
of using an interface provided by the Library.
A "Combined Work" is a work produced by combining or linking an
Application with the Library. The particular version of the Library
with which the Combined Work was made is also called the "Linked
Version".
The "Minimal Corresponding Source" for a Combined Work means the
Corresponding Source for the Combined Work, excluding any source code
for portions of the Combined Work that, considered in isolation, are
based on the Application, and not on the Linked Version.
The "Corresponding Application Code" for a Combined Work means the
object code and/or source code for the Application, including any data
and utility programs needed for reproducing the Combined Work from the
Application, but excluding the System Libraries of the Combined Work.
1. Exception to Section 3 of the GNU GPL.
You may convey a covered work under sections 3 and 4 of this License
without being bound by section 3 of the GNU GPL.
2. Conveying Modified Versions.
If you modify a copy of the Library, and, in your modifications, a
facility refers to a function or data to be supplied by an Application
that uses the facility (other than as an argument passed when the
facility is invoked), then you may convey a copy of the modified
version:
a) under this License, provided that you make a good faith effort to
ensure that, in the event an Application does not supply the
function or data, the facility still operates, and performs
whatever part of its purpose remains meaningful, or
b) under the GNU GPL, with none of the additional permissions of
this License applicable to that copy.
3. Object Code Incorporating Material from Library Header Files.
The object code form of an Application may incorporate material from
a header file that is part of the Library. You may convey such object
code under terms of your choice, provided that, if the incorporated
material is not limited to numerical parameters, data structure
layouts and accessors, or small macros, inline functions and templates
(ten or fewer lines in length), you do both of the following:
a) Give prominent notice with each copy of the object code that the
Library is used in it and that the Library and its use are
covered by this License.
b) Accompany the object code with a copy of the GNU GPL and this license
document.
4. Combined Works.
You may convey a Combined Work under terms of your choice that,
taken together, effectively do not restrict modification of the
portions of the Library contained in the Combined Work and reverse
engineering for debugging such modifications, if you also do each of
the following:
a) Give prominent notice with each copy of the Combined Work that
the Library is used in it and that the Library and its use are
covered by this License.
b) Accompany the Combined Work with a copy of the GNU GPL and this license
document.
c) For a Combined Work that displays copyright notices during
execution, include the copyright notice for the Library among
these notices, as well as a reference directing the user to the
copies of the GNU GPL and this license document.
d) Do one of the following:
0) Convey the Minimal Corresponding Source under the terms of this
License, and the Corresponding Application Code in a form
suitable for, and under terms that permit, the user to
recombine or relink the Application with a modified version of
the Linked Version to produce a modified Combined Work, in the
manner specified by section 6 of the GNU GPL for conveying
Corresponding Source.
1) Use a suitable shared library mechanism for linking with the
Library. A suitable mechanism is one that (a) uses at run time
a copy of the Library already present on the user's computer
system, and (b) will operate properly with a modified version
of the Library that is interface-compatible with the Linked
Version.
e) Provide Installation Information, but only if you would otherwise
be required to provide such information under section 6 of the
GNU GPL, and only to the extent that such information is
necessary to install and execute a modified version of the
Combined Work produced by recombining or relinking the
Application with a modified version of the Linked Version. (If
you use option 4d0, the Installation Information must accompany
the Minimal Corresponding Source and Corresponding Application
Code. If you use option 4d1, you must provide the Installation
Information in the manner specified by section 6 of the GNU GPL
for conveying Corresponding Source.)
5. Combined Libraries.
You may place library facilities that are a work based on the
Library side by side in a single library together with other library
facilities that are not Applications and are not covered by this
License, and convey such a combined library under terms of your
choice, if you do both of the following:
a) Accompany the combined library with a copy of the same work based
on the Library, uncombined with any other library facilities,
conveyed under the terms of this License.
b) Give prominent notice with the combined library that part of it
is a work based on the Library, and explaining where to find the
accompanying uncombined form of the same work.
6. Revised Versions of the GNU Lesser General Public License.
The Free Software Foundation may publish revised and/or new versions
of the GNU Lesser General Public License from time to time. Such new
versions will be similar in spirit to the present version, but may
differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the
Library as you received it specifies that a certain numbered version
of the GNU Lesser General Public License "or any later version"
applies to it, you have the option of following the terms and
conditions either of that published version or of any later version
published by the Free Software Foundation. If the Library as you
received it does not specify a version number of the GNU Lesser
General Public License, you may choose any version of the GNU Lesser
General Public License ever published by the Free Software Foundation.
If the Library as you received it specifies that a proxy can decide
whether future versions of the GNU Lesser General Public License shall
apply, that proxy's public statement of acceptance of any version is
permanent authorization for you to choose that version for the
Library.

48
lib/epdiy/Makefile Normal file
View File

@@ -0,0 +1,48 @@
# Rules for generating waveform and font headers from raw data.
SUPPORTRED_DISPLAYS := ED060SC4 ED097OC4 ED097TC2 ED047TC1 ED133UT2 ED060XC3 ED060SCT
# Generate 16 grascale update waveforms + epdiy special waveforms
EXPORTED_MODES ?= 1,2,5,16,17
# Generate waveforms in room temperature range
EXPORT_TEMPERATURE_RANGE ?= 15,35
FORMATTED_FILES := $(shell find ./ -regex '.*\.\(c\|cpp\|h\|ino\)$$' \
-not -regex '.*/\(.ccls-cache\|.cache\|waveforms\|\components\|build\)/.*' \
-not -regex '.*/img_.*.h' \
-not -regex '.*/build.*' \
-not -regex '.*/\(firasans_.*.h\|opensans.*.h\|amiri.h\|alexandria.h\|dragon.h\)' \
-not -regex '.*E[DS][0-9]*[A-Za-z]*[0-9].h')
# the default headers that should come with the distribution
default: \
$(patsubst %,src/waveforms/epdiy_%.h,$(SUPPORTRED_DISPLAYS))
clean:
rm src/waveforms/epdiy_*.h
rm src/waveforms/eink_*.h
format:
clang-format --style=file -i $(FORMATTED_FILES)
format-check:
clang-format --style=file --dry-run -Werror $(FORMATTED_FILES)
src/waveforms/epdiy_%.h: src/waveforms/epdiy_%.json
python3 scripts/waveform_hdrgen.py \
--export-modes $(EXPORTED_MODES) \
--temperature-range $(EXPORT_TEMPERATURE_RANGE) \
epdiy_$* < $< > $@
src/waveforms/eink_%.h: src/waveforms/eink_%.json
python3 scripts/waveform_hdrgen.py \
--export-modes $(EXPORTED_MODES) \
--temperature-range $(EXPORT_TEMPERATURE_RANGE) \
eink_$* < $< > $@
src/waveforms/epdiy_%.json:
python3 scripts/epdiy_waveform_gen.py $* > $@
.PHONY: default format

186
lib/epdiy/README.md Normal file
View File

@@ -0,0 +1,186 @@
[![Documentation Status](https://readthedocs.org/projects/epdiy/badge/?version=latest)](https://epdiy.readthedocs.io/en/latest/?badge=latest) [![Matrix](https://img.shields.io/matrix/epdiy-general:matrix.vroland.de?label=Matrix%20Chat)](https://matrix.to/#/!GUXWriqsBKkWyXzsBK:matrix.vroland.de?via=matrix.vroland.de) [![JoinSlack](https://img.shields.io/badge/Join%20us-on%20Slack-blueviolet.svg)](https://join.slack.com/t/epdiy/shared_invite/zt-189eo7328-bs94cfB~eXPbLYAD1rKQcg)
EPDiy E-Paper Driver
=======================================
EPDiy is a driver board which talks to affordable E-Paper (or E-Ink) screens, which are usually sold as replacement screens for E-Book readers. Why are they interesting?
* Easy on the eyes and paper-like aesthetics
* No power consumption when not updating
* Sunlight-readable
Ready-made DIY modules for this size and with 4bpp (16 Grayscale) color support are currently quite expensive and / or slow.
The EPDiy controller can drive the bare display modules, e.g. from old e-Readers, which are available for 20$ (small) / 30$ (large) on ebay!
Additionally, since it is based on the ESP32S3 (V7) / ESP32 (V2-V6) microcontroller, it features WiFi and Bluetooth connectivity.
The EPDiy driver board targets a range of E-Paper displays, as shown in the table below.
As the driving method for all matrix-based E-ink displays is more or less the same, only the right connector and timings are needed.
The current V7 board has three different display connectors, other display will require an adapter board.
The controller is optimized for the use with LiPo batteries, featuring a LiPo charger and ultra-low deep sleep current.
This project supports a driver for the ESP-IDF and Arduino. For installation instructions, please refer to the [documentation](https://epdiy.readthedocs.io/en/latest/getting_started.html#getting-your-board).
Note that for epdiy V7, update speeds are significantly lower when using the Arduino IDE, because it does not allow to change
the sub-optimal cache configuration.
Get Inspired
------------
The `examples` directory contains some example applications like a weather station or a screen diagnostic test.
If you want to build something more useful though, how about:
- A serial terminal for connecting to a raspberry pi: [video](https://cdn.hackaday.io/files/1681937195969312/terminal_demo.mp4) [repository](https://github.com/vroland/epdiy-terminal)]
- A Music Player Daemon (MPD) dashboard: [repository](https://github.com/vroland/epdiy-mpd)]
- An e-Paper picture frame: [video](https://www.youtube.com/watch?v=r7AcNQsSZUw)
- And more to come!
Building It
-----------
On the [EPDiy Hardware Page](https://vroland.github.io/epdiy-hardware/), you'll find a list of all boards and variants, adapters, and helpers.
Next to each board, there are manufacturing files (gerbers), Bill of Materials (BoM), part placement files,
and 3D models ready to use!
![demo image](doc/source/img/hardware_page.png)
For ordering from JLCPCB for example, ordering is as easy as downloading the zipped gerbers, BoM, and placement file
and uploading them. The process is very similar for other manufacturers, check your vendor's documentation for details.
Don't forget to oder adapters if the board doesn't have connectors for your specific display.
The current latest version is epdiy V7, beased on the ESP32S3.
Older versions are also available on the hardware page.
#### Contributing Hardware
Want to contribute your own board variant or adapter?
Check out the [epdiy-hardware repository](https://github.com/vroland/epdiy-hardware) for instructions.
Gettings Started
----------------
For instructions and more information visit the [documentation](https://epdiy.readthedocs.io/en/latest/getting_started.html)!
Join the Discussion
----------------
- [![Matrix](https://img.shields.io/matrix/epdiy-general:matrix.vroland.de?label=Join%20Matrix)](https://matrix.to/#/!GUXWriqsBKkWyXzsBK:matrix.vroland.de?via=matrix.vroland.de) Matrix Community: +epdiy:matrix.vroland.de
- Slack: See badge
Displays
--------
|Name |Size |Resolution|Compatible|Connector|Pin count|Compatible since pcb version|Notes
| --: | --: | --: | --: | --: | --: | --: | --: |
| ED060SC4 | 6" | 800 x 600<br>167 PPI | yes, tested | FH26W-39S-0.3SHW(60) | 39 | v2 | |
|ED097OC4|9.7"|1200 x 825<br>150 PPI|yes, tested|XF2M-3315-1A|33|v2|Cheap, inferior contrast
|ED097TC2|9.7"|1200 x 825<br>150 PPI|yes, tested|XF2M-3315-1A|33|v2|Slightly higher price, better contrast
|ED097OC1|9.7"|1200 x 825<br>150 PPI|yes (should work)|XF2M-3315-1A|33|v2|Cheap, inferior performance
|ED047TC1|4.7"|960 x 540<br>234 PPI|yes, tested|40-pin|40|LILYGO 4.7" EPD|Supported only by 4.7" e-paper board by LILYGO
| ED050SC5 | 5" | 600 x 800<br>200 PPI | yes, tested | THD0510-33CL-GF | 33 | v5 |
| ED050SC3 | 5" | 600 x 800<br>200 PPI | yes (should work) | THD0510-33CL-GF | 33 | v5 |
| ED052TC4 | 5.2" | 1280 x 780<br>??? PPI | yes (should work) | WP27D-P050VA3 | 50 | v5 |
| ED133UT2 | 13.3" | 1600 x 1200<br>150 PPI | yes, tested | adapter board | 39 | v2 | Adapter Board required, also PENG133D
| ED060XC3 | 6" | 758 x 1024<br>212 PPI | yes, tested | THD0515-34CL-SN | 34 | v5 | Cheapest, good contrast and resolution
| ED060XD4 | 6" | 758 x 1024<br>212 PPI | yes, tested | THD0515-34CL-SN | 34 | v5 |
| ED060XC5 | 6" | 758 x 1024<br>212 PPI | yes (should work as ED060XC3) | THD0515-34CL-SN | 34 | v5 |
| ED060XD6 | 6" | 758 x 1024<br>212 PPI | yes (should work as ED060XC3) | THD0515-34CL-SN | 34 | v5 |
| ED060XH2 | 6" | 758 x 1024<br>212 PPI | yes (should work as ED060XC3) | THD0515-34CL-SN | 34 | v5 |
| ED060XC9 | 6" | 758 x 1024<br>212 PPI | yes (should work as ED060XC3) | THD0515-34CL-SN | 34 | v5 |
| ED060KD1 | 6" | 1072 x 1448<br>300 PPI | yes (should work as ED060XC3) | THD0515-34CL-SN | 34 | v5 |
| ED060KC1 | 6" | 1072 x 1448<br>300 PPI | yes (should work as ED060XC3) | THD0515-34CL-SN | 34 | v5 |
| ED060SCF | 6" | 600 x 800<br>167 PPI | yes, tested | THD0515-34CL-SN | 34 | v5 | Different flex cable shape
| ED060SCN | 6" | 600 x 800<br>167 PPI | yes (should work as ED060XC3) | THD0515-34CL-SN | 34 | v5 | Different flex cable shape
| ED060SCP | 6" | 600 x 800<br>167 PPI | yes (should work as ED060XC3) | THD0515-34CL-SN | 34 | v5 | Different flex cable shape
| ED060SC7 | 6" | 600 x 800<br>167 PPI | yes (should work) | AXT334124 | 34 | v5 | connector dropped in v6
| ED060SCG | 6" | 600 x 800<br>167 PPI | yes (should work) | AXT334124 | 34 | v5 | connector dropped in v6
| ED060SCE | 6" | 600 x 800<br>167 PPI | yes (should work) | AXT334124 | 34 | v5 | connector dropped in v6
| ED060SCM | 6" | 600 x 800<br>167 PPI | yes (should work) | AXT334124 | 34 | v5 | connector dropped in v6
| ED060SCT | 6" | 600 x 800<br>167 PPI | yes, tested | AXT334124 | 34 | v5 | connector dropped in v6
| ED078KC1 | 7.8" | 1872 x 1404<br>300 PPI | yes, tested | FH12-40S-0.5SH | 40 | v7 | 16 data lines
Troubleshooting
---------------
The following list is compiled from past experiences and GitHub issues:
* **The displayed image displays only part of the image.** Make sure to select the correct display type as described [here](https://epdiy.readthedocs.io/en/latest/getting_started.html#selecting-a-display-type).
* **The existing image fades / darkens when updating a partial screen region.** Make sure the VCOM voltage is [calibrated](https://epdiy.readthedocs.io/en/latest/getting_started.html#calibrate-vcom) for your specific display.
* **The second third of the image is replaced with the last third.** This seems to be a timing issue we could not yet quite figure out the reason for. For a workarround or suggestions please [join the discussion](https://github.com/vroland/epdiy/issues/15).
* **The ESP does not boot correctly when external periperals are connected.** Make sure not to pull GPIO12 high during boot, as it is a strapping pin internal voltage selection (https://github.com/vroland/epdiy/issues/17).
* **The ESP power consumption in deep sleep is too high.** Add `rtc_gpio_isolate(GPIO_NUM_12);` to your solution. See also [Configuring IOs (Deep-sleep Only)](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/system/sleep_modes.html?highlight=rtc_gpio_isolate#configuring-ios-deep-sleep-only).
LilyGo Boards
---------------
### Supported LilyGo Boards
| Board | Display | Board Definition | Notes |
| --: | --: | --: | --: |
| LilyGo T5 4.7" | ED047TC1 | `epd_board_lilygo_t5_47` | Original T5 4.7" |
| LilyGo T5 S3 E-Paper Pro | ED047TC1 | `epd_board_v7` | ESP32-S3 based, includes GT911 touch, PCF8563 RTC, BQ25896/BQ27220 battery management |
### Power Management
There are several differences with these boards.
One particular one is the way the LilyGo handles power to the display the official lilygo code has two states.
This is now handled in epdiy in a different way to the lilygo code.
**epd_poweroff()** completely turns the power off to the display and the other peripherals of the lilygo.
The new function **epd_powerdown()** keeps the peripherals on (this allows the touch functions to continue to work).
**epd_poweroff() should always be called before sleeping the system**
You can still use touch to wake the screen with the following.
In Arduino it works like this.
`epd_poweroff();`
`epd_deinit();`
`esp_sleep_enable_ext1_wakeup(GPIO_SEL_13, ESP_EXT1_WAKEUP_ANY_HIGH);`
`esp_deep_sleep_start();`
### I2C Bus Sharing (Arduino)
When using epdiy with Arduino on boards like the T5 S3 E-Paper Pro, you may need to share the I2C bus between epdiy and other peripherals (touch controller, RTC, battery gauge, etc.).
Epdiy's board initialization will detect if the I2C driver is already installed (e.g., by Arduino's `Wire.begin()`) and reuse the existing driver instead of failing. This allows you to:
1. Call `Wire.begin(SDA, SCL)` before `epd_init()` to initialize the I2C bus
2. Use `Wire` for other I2C devices (GT911 touch, PCF8563 RTC, BQ27220 fuel gauge)
3. Protect shared I2C access with a mutex if accessing from multiple tasks
Example initialization order for T5 S3 E-Paper Pro:
```cpp
Wire.begin(39, 40); // Initialize I2C first (SDA=39, SCL=40)
epd_init(&epd_board_v7, &ED047TC1, EPD_LUT_64K); // epdiy reuses I2C driver
// Now both epdiy and Wire can coexist on the same I2C bus
```
More on E-Paper Displays
------------------------
* List of E-Paper devices and their screens: https://e-ink-reader.ru/chg_dsp_en.php (thanks, @mcer12)
* Reverse engineering of display pins, possible starting point for alternative drivers: https://linux-sunxi.org/PocketBook_Touch_Lux_3 (thanks, @mcer12)
* Reverse engineering and explanation on driving EPDs: http://essentialscrap.com/eink/index.html
* Earlier take on driving 6" EPDs with an ESP32, basis of original power circuit: http://spritesmods.com/?art=einkdisplay&page=1
* Related Hackaday projects: https://hackaday.io/project/21607 https://hackaday.io/project/11537
If you know any other useful resources or have suggestions, please comment on #31!
Hackaday Project
----------------
For more details, see the project page on Hackaday: https://hackaday.io/project/168193-epdiy-976-e-paper-controller
![demo image](doc/source/img/demo.jpg)
![board front](doc/source/img/v6.jpg)
Licenses
--------
The weather example is Copyright (c) David Bird 2018 (except for minor modifications). Please refer to `examples/weather/README.md` for details.
The board and schematic are licensed under a <a rel="license" href="https://creativecommons.org/licenses/by-sa/4.0/"><img alt="Creative Commons License" style="border-width:0" src="https://i.creativecommons.org/l/by-sa/4.0/80x15.png" /></a> <a rel="license" href="https://creativecommons.org/licenses/by-sa/4.0/">Creative Commons Attribution-ShareAlike 4.0 International License</a>.
Firmware and remaining examples are licensed under the terms of the GNU Lesser GPL version 3.
Utilities are licensed under the terms of the MIT license.

338
lib/epdiy/doc/Doxyfile Normal file
View File

@@ -0,0 +1,338 @@
# Doxyfile 1.8.17
#---------------------------------------------------------------------------
# Project related configuration options
#---------------------------------------------------------------------------
DOXYFILE_ENCODING = UTF-8
PROJECT_NAME = "EPDiy"
PROJECT_NUMBER =
PROJECT_BRIEF =
PROJECT_LOGO =
OUTPUT_DIRECTORY =
CREATE_SUBDIRS = NO
ALLOW_UNICODE_NAMES = NO
OUTPUT_LANGUAGE = English
OUTPUT_TEXT_DIRECTION = None
BRIEF_MEMBER_DESC = YES
REPEAT_BRIEF = YES
ABBREVIATE_BRIEF = "The $name class" \
"The $name widget" \
"The $name file" \
is \
provides \
specifies \
contains \
represents \
a \
an \
the
ALWAYS_DETAILED_SEC = NO
INLINE_INHERITED_MEMB = NO
FULL_PATH_NAMES = YES
STRIP_FROM_PATH =
STRIP_FROM_INC_PATH =
SHORT_NAMES = NO
JAVADOC_AUTOBRIEF = NO
JAVADOC_BANNER = NO
QT_AUTOBRIEF = NO
MULTILINE_CPP_IS_BRIEF = NO
INHERIT_DOCS = YES
SEPARATE_MEMBER_PAGES = NO
TAB_SIZE = 4
ALIASES =
TCL_SUBST =
OPTIMIZE_OUTPUT_FOR_C = YES
OPTIMIZE_OUTPUT_JAVA = NO
OPTIMIZE_FOR_FORTRAN = NO
OPTIMIZE_OUTPUT_VHDL = NO
OPTIMIZE_OUTPUT_SLICE = NO
EXTENSION_MAPPING =
MARKDOWN_SUPPORT = YES
TOC_INCLUDE_HEADINGS = 5
AUTOLINK_SUPPORT = YES
BUILTIN_STL_SUPPORT = NO
CPP_CLI_SUPPORT = NO
SIP_SUPPORT = NO
IDL_PROPERTY_SUPPORT = YES
DISTRIBUTE_GROUP_DOC = NO
GROUP_NESTED_COMPOUNDS = NO
SUBGROUPING = YES
INLINE_GROUPED_CLASSES = NO
INLINE_SIMPLE_STRUCTS = NO
TYPEDEF_HIDES_STRUCT = NO
LOOKUP_CACHE_SIZE = 0
#---------------------------------------------------------------------------
# Build related configuration options
#---------------------------------------------------------------------------
EXTRACT_ALL = NO
EXTRACT_PRIVATE = NO
EXTRACT_PRIV_VIRTUAL = NO
EXTRACT_PACKAGE = NO
EXTRACT_STATIC = NO
EXTRACT_LOCAL_CLASSES = YES
EXTRACT_LOCAL_METHODS = NO
EXTRACT_ANON_NSPACES = NO
HIDE_UNDOC_MEMBERS = NO
HIDE_UNDOC_CLASSES = NO
HIDE_FRIEND_COMPOUNDS = NO
HIDE_IN_BODY_DOCS = NO
INTERNAL_DOCS = NO
CASE_SENSE_NAMES = YES
HIDE_SCOPE_NAMES = NO
HIDE_COMPOUND_REFERENCE= NO
SHOW_INCLUDE_FILES = YES
SHOW_GROUPED_MEMB_INC = NO
FORCE_LOCAL_INCLUDES = NO
INLINE_INFO = YES
SORT_MEMBER_DOCS = YES
SORT_BRIEF_DOCS = NO
SORT_MEMBERS_CTORS_1ST = NO
SORT_GROUP_NAMES = NO
SORT_BY_SCOPE_NAME = NO
STRICT_PROTO_MATCHING = NO
GENERATE_TODOLIST = YES
GENERATE_TESTLIST = YES
GENERATE_BUGLIST = YES
GENERATE_DEPRECATEDLIST= YES
ENABLED_SECTIONS =
MAX_INITIALIZER_LINES = 30
SHOW_USED_FILES = YES
SHOW_FILES = YES
SHOW_NAMESPACES = YES
FILE_VERSION_FILTER =
LAYOUT_FILE =
CITE_BIB_FILES =
#---------------------------------------------------------------------------
# Configuration options related to warning and progress messages
#---------------------------------------------------------------------------
QUIET = NO
WARNINGS = YES
WARN_IF_UNDOCUMENTED = YES
WARN_IF_DOC_ERROR = YES
WARN_NO_PARAMDOC = NO
WARN_AS_ERROR = NO
WARN_FORMAT = "$file:$line: $text"
WARN_LOGFILE =
#---------------------------------------------------------------------------
# Configuration options related to the input files
#---------------------------------------------------------------------------
INPUT = ../src/
INPUT_ENCODING = UTF-8
FILE_PATTERNS = *.c \
*.h
RECURSIVE = NO
EXCLUDE =
EXCLUDE_SYMLINKS = NO
EXCLUDE_PATTERNS =
EXCLUDE_SYMBOLS =
EXAMPLE_PATH =
EXAMPLE_PATTERNS = *
EXAMPLE_RECURSIVE = NO
IMAGE_PATH =
INPUT_FILTER =
FILTER_PATTERNS =
FILTER_SOURCE_FILES = NO
FILTER_SOURCE_PATTERNS =
USE_MDFILE_AS_MAINPAGE =
#---------------------------------------------------------------------------
# Configuration options related to source browsing
#---------------------------------------------------------------------------
SOURCE_BROWSER = NO
INLINE_SOURCES = NO
STRIP_CODE_COMMENTS = YES
REFERENCED_BY_RELATION = NO
REFERENCES_RELATION = NO
REFERENCES_LINK_SOURCE = YES
SOURCE_TOOLTIPS = YES
USE_HTAGS = NO
VERBATIM_HEADERS = YES
#---------------------------------------------------------------------------
# Configuration options related to the alphabetical class index
#---------------------------------------------------------------------------
ALPHABETICAL_INDEX = YES
COLS_IN_ALPHA_INDEX = 5
IGNORE_PREFIX =
#---------------------------------------------------------------------------
# Configuration options related to the HTML output
#---------------------------------------------------------------------------
GENERATE_HTML = NO
HTML_OUTPUT = html
HTML_FILE_EXTENSION = .html
HTML_HEADER =
HTML_FOOTER =
HTML_STYLESHEET =
HTML_EXTRA_STYLESHEET =
HTML_EXTRA_FILES =
HTML_COLORSTYLE_HUE = 220
HTML_COLORSTYLE_SAT = 100
HTML_COLORSTYLE_GAMMA = 80
HTML_TIMESTAMP = NO
HTML_DYNAMIC_MENUS = YES
HTML_DYNAMIC_SECTIONS = NO
HTML_INDEX_NUM_ENTRIES = 100
GENERATE_DOCSET = NO
DOCSET_FEEDNAME = "Doxygen generated docs"
DOCSET_BUNDLE_ID = org.doxygen.Project
DOCSET_PUBLISHER_ID = org.doxygen.Publisher
DOCSET_PUBLISHER_NAME = Publisher
GENERATE_HTMLHELP = NO
CHM_FILE =
HHC_LOCATION =
GENERATE_CHI = NO
CHM_INDEX_ENCODING =
BINARY_TOC = NO
TOC_EXPAND = NO
GENERATE_QHP = NO
QCH_FILE =
QHP_NAMESPACE = org.doxygen.Project
QHP_VIRTUAL_FOLDER = doc
QHP_CUST_FILTER_NAME =
QHP_CUST_FILTER_ATTRS =
QHP_SECT_FILTER_ATTRS =
QHG_LOCATION =
GENERATE_ECLIPSEHELP = NO
ECLIPSE_DOC_ID = org.doxygen.Project
DISABLE_INDEX = NO
GENERATE_TREEVIEW = NO
ENUM_VALUES_PER_LINE = 4
TREEVIEW_WIDTH = 250
EXT_LINKS_IN_WINDOW = NO
FORMULA_FONTSIZE = 10
FORMULA_TRANSPARENT = YES
FORMULA_MACROFILE =
USE_MATHJAX = NO
MATHJAX_FORMAT = HTML-CSS
MATHJAX_RELPATH = https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/
MATHJAX_EXTENSIONS =
MATHJAX_CODEFILE =
SEARCHENGINE = YES
SERVER_BASED_SEARCH = NO
EXTERNAL_SEARCH = NO
SEARCHENGINE_URL =
SEARCHDATA_FILE = searchdata.xml
EXTERNAL_SEARCH_ID =
EXTRA_SEARCH_MAPPINGS =
#---------------------------------------------------------------------------
# Configuration options related to the LaTeX output
#---------------------------------------------------------------------------
GENERATE_LATEX = NO
LATEX_OUTPUT = latex
LATEX_CMD_NAME =
MAKEINDEX_CMD_NAME = makeindex
LATEX_MAKEINDEX_CMD = makeindex
COMPACT_LATEX = NO
PAPER_TYPE = a4
EXTRA_PACKAGES =
LATEX_HEADER =
LATEX_FOOTER =
LATEX_EXTRA_STYLESHEET =
LATEX_EXTRA_FILES =
PDF_HYPERLINKS = YES
USE_PDFLATEX = YES
LATEX_BATCHMODE = NO
LATEX_HIDE_INDICES = NO
LATEX_SOURCE_CODE = NO
LATEX_BIB_STYLE = plain
LATEX_TIMESTAMP = NO
LATEX_EMOJI_DIRECTORY =
#---------------------------------------------------------------------------
# Configuration options related to the RTF output
#---------------------------------------------------------------------------
GENERATE_RTF = NO
RTF_OUTPUT = rtf
COMPACT_RTF = NO
RTF_HYPERLINKS = NO
RTF_STYLESHEET_FILE =
RTF_EXTENSIONS_FILE =
RTF_SOURCE_CODE = NO
#---------------------------------------------------------------------------
# Configuration options related to the man page output
#---------------------------------------------------------------------------
GENERATE_MAN = NO
MAN_OUTPUT = man
MAN_EXTENSION = .3
MAN_SUBDIR =
MAN_LINKS = NO
#---------------------------------------------------------------------------
# Configuration options related to the XML output
#---------------------------------------------------------------------------
GENERATE_XML = YES
XML_OUTPUT = source/xml
XML_PROGRAMLISTING = YES
XML_NS_MEMB_FILE_SCOPE = NO
#---------------------------------------------------------------------------
# Configuration options related to the DOCBOOK output
#---------------------------------------------------------------------------
GENERATE_DOCBOOK = NO
DOCBOOK_OUTPUT = docbook
DOCBOOK_PROGRAMLISTING = NO
#---------------------------------------------------------------------------
# Configuration options for the AutoGen Definitions output
#---------------------------------------------------------------------------
GENERATE_AUTOGEN_DEF = NO
#---------------------------------------------------------------------------
# Configuration options related to the Perl module output
#---------------------------------------------------------------------------
GENERATE_PERLMOD = NO
PERLMOD_LATEX = NO
PERLMOD_PRETTY = YES
PERLMOD_MAKEVAR_PREFIX =
#---------------------------------------------------------------------------
# Configuration options related to the preprocessor
#---------------------------------------------------------------------------
ENABLE_PREPROCESSING = YES
MACRO_EXPANSION = YES
EXPAND_ONLY_PREDEF = YES
SEARCH_INCLUDES = YES
INCLUDE_PATH =
INCLUDE_FILE_PATTERNS =
PREDEFINED = IRAM_ATTR= \
EXPAND_AS_DEFINED =
SKIP_FUNCTION_MACROS = YES
#---------------------------------------------------------------------------
# Configuration options related to external references
#---------------------------------------------------------------------------
TAGFILES =
GENERATE_TAGFILE =
ALLEXTERNALS = NO
EXTERNAL_GROUPS = YES
EXTERNAL_PAGES = YES
#---------------------------------------------------------------------------
# Configuration options related to the dot tool
#---------------------------------------------------------------------------
CLASS_DIAGRAMS = YES
DIA_PATH =
HIDE_UNDOC_RELATIONS = YES
HAVE_DOT = NO
DOT_NUM_THREADS = 0
DOT_FONTNAME = Helvetica
DOT_FONTSIZE = 10
DOT_FONTPATH =
CLASS_GRAPH = YES
COLLABORATION_GRAPH = YES
GROUP_GRAPHS = YES
UML_LOOK = NO
UML_LIMIT_NUM_FIELDS = 10
TEMPLATE_RELATIONS = NO
INCLUDE_GRAPH = YES
INCLUDED_BY_GRAPH = YES
CALL_GRAPH = NO
CALLER_GRAPH = NO
GRAPHICAL_HIERARCHY = YES
DIRECTORY_GRAPH = YES
DOT_IMAGE_FORMAT = png
INTERACTIVE_SVG = NO
DOT_PATH =
DOTFILE_DIRS =
MSCFILE_DIRS =
DIAFILE_DIRS =
PLANTUML_JAR_PATH =
PLANTUML_CFG_FILE =
PLANTUML_INCLUDE_PATH =
DOT_GRAPH_MAX_NODES = 50
MAX_DOT_GRAPH_DEPTH = 0
DOT_TRANSPARENT = NO
DOT_MULTI_TARGETS = NO
GENERATE_LEGEND = YES
DOT_CLEANUP = YES

23
lib/epdiy/doc/Makefile Normal file
View File

@@ -0,0 +1,23 @@
# Minimal makefile for Sphinx documentation
#
# You can set these variables from the command line, and also
# from the environment for the first two.
SPHINXOPTS ?=
SPHINXBUILD ?= sphinx-build
SOURCEDIR = source
BUILDDIR = build
# Put it first so that "make" without argument is like "make help".
help:
@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
doxygen:
doxygen
.PHONY: help Makefile doxygen
# Catch-all target: route all unknown targets to Sphinx using the new
# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
%: Makefile doxygen
@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)

BIN
lib/epdiy/doc/html/bc_s.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 676 B

BIN
lib/epdiy/doc/html/bdwn.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 132 B

BIN
lib/epdiy/doc/html/doc.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 746 B

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

View File

@@ -0,0 +1,120 @@
/*
@licstart The following is the entire license notice for the
JavaScript code in this file.
Copyright (C) 1997-2017 by Dimitri van Heesch
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
@licend The above is the entire license notice
for the JavaScript code in this file
*/
function toggleVisibility(linkObj)
{
var base = $(linkObj).attr('id');
var summary = $('#'+base+'-summary');
var content = $('#'+base+'-content');
var trigger = $('#'+base+'-trigger');
var src=$(trigger).attr('src');
if (content.is(':visible')===true) {
content.hide();
summary.show();
$(linkObj).addClass('closed').removeClass('opened');
$(trigger).attr('src',src.substring(0,src.length-8)+'closed.png');
} else {
content.show();
summary.hide();
$(linkObj).removeClass('closed').addClass('opened');
$(trigger).attr('src',src.substring(0,src.length-10)+'open.png');
}
return false;
}
function updateStripes()
{
$('table.directory tr').
removeClass('even').filter(':visible:even').addClass('even');
}
function toggleLevel(level)
{
$('table.directory tr').each(function() {
var l = this.id.split('_').length-1;
var i = $('#img'+this.id.substring(3));
var a = $('#arr'+this.id.substring(3));
if (l<level+1) {
i.removeClass('iconfopen iconfclosed').addClass('iconfopen');
a.html('&#9660;');
$(this).show();
} else if (l==level+1) {
i.removeClass('iconfclosed iconfopen').addClass('iconfclosed');
a.html('&#9658;');
$(this).show();
} else {
$(this).hide();
}
});
updateStripes();
}
function toggleFolder(id)
{
// the clicked row
var currentRow = $('#row_'+id);
// all rows after the clicked row
var rows = currentRow.nextAll("tr");
var re = new RegExp('^row_'+id+'\\d+_$', "i"); //only one sub
// only match elements AFTER this one (can't hide elements before)
var childRows = rows.filter(function() { return this.id.match(re); });
// first row is visible we are HIDING
if (childRows.filter(':first').is(':visible')===true) {
// replace down arrow by right arrow for current row
var currentRowSpans = currentRow.find("span");
currentRowSpans.filter(".iconfopen").removeClass("iconfopen").addClass("iconfclosed");
currentRowSpans.filter(".arrow").html('&#9658;');
rows.filter("[id^=row_"+id+"]").hide(); // hide all children
} else { // we are SHOWING
// replace right arrow by down arrow for current row
var currentRowSpans = currentRow.find("span");
currentRowSpans.filter(".iconfclosed").removeClass("iconfclosed").addClass("iconfopen");
currentRowSpans.filter(".arrow").html('&#9660;');
// replace down arrows by right arrows for child rows
var childRowsSpans = childRows.find("span");
childRowsSpans.filter(".iconfopen").removeClass("iconfopen").addClass("iconfclosed");
childRowsSpans.filter(".arrow").html('&#9658;');
childRows.show(); //show all children
}
updateStripes();
}
function toggleInherit(id)
{
var rows = $('tr.inherit.'+id);
var img = $('tr.inherit_header.'+id+' img');
var src = $(img).attr('src');
if (rows.filter(':first').is(':visible')===true) {
rows.css('display','none');
$(img).attr('src',src.substring(0,src.length-8)+'closed.png');
} else {
rows.css('display','table-row'); // using show() causes jump in firefox
$(img).attr('src',src.substring(0,src.length-10)+'open.png');
}
}
/* @license-end */

Binary file not shown.

After

Width:  |  Height:  |  Size: 616 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 597 B

View File

@@ -0,0 +1,76 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.17"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>My Project: Main Page</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">My Project
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.17 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
var searchBox = new SearchBox("searchBox", "search",false,'Search');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */</script>
<div id="main-nav"></div>
</div><!-- top -->
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div class="header">
<div class="headertitle">
<div class="title">My Project Documentation</div> </div>
</div><!--header-->
<div class="contents">
</div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.17
</small></address>
</body>
</html>

35
lib/epdiy/doc/html/jquery.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,50 @@
/*
@licstart The following is the entire license notice for the
JavaScript code in this file.
Copyright (C) 1997-2017 by Dimitri van Heesch
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
@licend The above is the entire license notice
for the JavaScript code in this file
*/
function initMenu(relPath,searchEnabled,serverSide,searchPage,search) {
function makeTree(data,relPath) {
var result='';
if ('children' in data) {
result+='<ul>';
for (var i in data.children) {
result+='<li><a href="'+relPath+data.children[i].url+'">'+
data.children[i].text+'</a>'+
makeTree(data.children[i],relPath)+'</li>';
}
result+='</ul>';
}
return result;
}
$('#main-nav').append(makeTree(menudata,relPath));
$('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu');
if (searchEnabled) {
if (serverSide) {
$('#main-menu').append('<li style="float:right"><div id="MSearchBox" class="MSearchBoxInactive"><div class="left"><form id="FSearchBox" action="'+relPath+searchPage+'" method="get"><img id="MSearchSelect" src="'+relPath+'search/mag.png" alt=""/><input type="text" id="MSearchField" name="query" value="'+search+'" size="20" accesskey="S" onfocus="searchBox.OnSearchFieldFocus(true)" onblur="searchBox.OnSearchFieldFocus(false)"></form></div><div class="right"></div></div></li>');
} else {
$('#main-menu').append('<li style="float:right"><div id="MSearchBox" class="MSearchBoxInactive"><span class="left"><img id="MSearchSelect" src="'+relPath+'search/mag_sel.png" onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" alt=""/><input type="text" id="MSearchField" value="'+search+'" accesskey="S" onfocus="searchBox.OnSearchFieldFocus(true)" onblur="searchBox.OnSearchFieldFocus(false)" onkeyup="searchBox.OnSearchFieldChange(event)"/></span><span class="right"><a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="'+relPath+'search/close.png" alt=""/></a></span></div></li>');
}
}
$('#main-menu').smartmenus();
}
/* @license-end */

View File

@@ -0,0 +1,24 @@
/*
@licstart The following is the entire license notice for the
JavaScript code in this file.
Copyright (C) 1997-2019 by Dimitri van Heesch
This program is free software; you can redistribute it and/or modify
it under the terms of version 2 of the GNU General Public License as published by
the Free Software Foundation
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
@licend The above is the entire license notice
for the JavaScript code in this file
*/
var menudata={children:[
{text:"Main Page",url:"index.html"}]}

Binary file not shown.

After

Width:  |  Height:  |  Size: 153 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 B

BIN
lib/epdiy/doc/html/open.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 123 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 273 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 465 B

View File

@@ -0,0 +1,12 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html><head><title></title>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<link rel="stylesheet" type="text/css" href="search.css"/>
<script type="text/javascript" src="search.js"></script>
</head>
<body class="SRPage">
<div id="SRIndex">
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,271 @@
/*---------------- Search Box */
#FSearchBox {
float: left;
}
#MSearchBox {
white-space : nowrap;
float: none;
margin-top: 8px;
right: 0px;
width: 170px;
height: 24px;
z-index: 102;
}
#MSearchBox .left
{
display:block;
position:absolute;
left:10px;
width:20px;
height:19px;
background:url('search_l.png') no-repeat;
background-position:right;
}
#MSearchSelect {
display:block;
position:absolute;
width:20px;
height:19px;
}
.left #MSearchSelect {
left:4px;
}
.right #MSearchSelect {
right:5px;
}
#MSearchField {
display:block;
position:absolute;
height:19px;
background:url('search_m.png') repeat-x;
border:none;
width:115px;
margin-left:20px;
padding-left:4px;
color: #909090;
outline: none;
font: 9pt Arial, Verdana, sans-serif;
-webkit-border-radius: 0px;
}
#FSearchBox #MSearchField {
margin-left:15px;
}
#MSearchBox .right {
display:block;
position:absolute;
right:10px;
top:8px;
width:20px;
height:19px;
background:url('search_r.png') no-repeat;
background-position:left;
}
#MSearchClose {
display: none;
position: absolute;
top: 4px;
background : none;
border: none;
margin: 0px 4px 0px 0px;
padding: 0px 0px;
outline: none;
}
.left #MSearchClose {
left: 6px;
}
.right #MSearchClose {
right: 2px;
}
.MSearchBoxActive #MSearchField {
color: #000000;
}
/*---------------- Search filter selection */
#MSearchSelectWindow {
display: none;
position: absolute;
left: 0; top: 0;
border: 1px solid #90A5CE;
background-color: #F9FAFC;
z-index: 10001;
padding-top: 4px;
padding-bottom: 4px;
-moz-border-radius: 4px;
-webkit-border-top-left-radius: 4px;
-webkit-border-top-right-radius: 4px;
-webkit-border-bottom-left-radius: 4px;
-webkit-border-bottom-right-radius: 4px;
-webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
}
.SelectItem {
font: 8pt Arial, Verdana, sans-serif;
padding-left: 2px;
padding-right: 12px;
border: 0px;
}
span.SelectionMark {
margin-right: 4px;
font-family: monospace;
outline-style: none;
text-decoration: none;
}
a.SelectItem {
display: block;
outline-style: none;
color: #000000;
text-decoration: none;
padding-left: 6px;
padding-right: 12px;
}
a.SelectItem:focus,
a.SelectItem:active {
color: #000000;
outline-style: none;
text-decoration: none;
}
a.SelectItem:hover {
color: #FFFFFF;
background-color: #3D578C;
outline-style: none;
text-decoration: none;
cursor: pointer;
display: block;
}
/*---------------- Search results window */
iframe#MSearchResults {
width: 60ex;
height: 15em;
}
#MSearchResultsWindow {
display: none;
position: absolute;
left: 0; top: 0;
border: 1px solid #000;
background-color: #EEF1F7;
z-index:10000;
}
/* ----------------------------------- */
#SRIndex {
clear:both;
padding-bottom: 15px;
}
.SREntry {
font-size: 10pt;
padding-left: 1ex;
}
.SRPage .SREntry {
font-size: 8pt;
padding: 1px 5px;
}
body.SRPage {
margin: 5px 2px;
}
.SRChildren {
padding-left: 3ex; padding-bottom: .5em
}
.SRPage .SRChildren {
display: none;
}
.SRSymbol {
font-weight: bold;
color: #425E97;
font-family: Arial, Verdana, sans-serif;
text-decoration: none;
outline: none;
}
a.SRScope {
display: block;
color: #425E97;
font-family: Arial, Verdana, sans-serif;
text-decoration: none;
outline: none;
}
a.SRSymbol:focus, a.SRSymbol:active,
a.SRScope:focus, a.SRScope:active {
text-decoration: underline;
}
span.SRScope {
padding-left: 4px;
}
.SRPage .SRStatus {
padding: 2px 5px;
font-size: 8pt;
font-style: italic;
}
.SRResult {
display: none;
}
DIV.searchresults {
margin-left: 10px;
margin-right: 10px;
}
/*---------------- External search page results */
.searchresult {
background-color: #F0F3F8;
}
.pages b {
color: white;
padding: 5px 5px 3px 5px;
background-image: url("../tab_a.png");
background-repeat: repeat-x;
text-shadow: 0 1px 1px #000000;
}
.pages {
line-height: 17px;
margin-left: 4px;
text-decoration: none;
}
.hl {
font-weight: bold;
}
#searchresults {
margin-bottom: 20px;
}
.searchpages {
margin-top: 10px;
}

View File

@@ -0,0 +1,814 @@
/*
@licstart The following is the entire license notice for the
JavaScript code in this file.
Copyright (C) 1997-2017 by Dimitri van Heesch
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
@licend The above is the entire license notice
for the JavaScript code in this file
*/
function convertToId(search)
{
var result = '';
for (i=0;i<search.length;i++)
{
var c = search.charAt(i);
var cn = c.charCodeAt(0);
if (c.match(/[a-z0-9\u0080-\uFFFF]/))
{
result+=c;
}
else if (cn<16)
{
result+="_0"+cn.toString(16);
}
else
{
result+="_"+cn.toString(16);
}
}
return result;
}
function getXPos(item)
{
var x = 0;
if (item.offsetWidth)
{
while (item && item!=document.body)
{
x += item.offsetLeft;
item = item.offsetParent;
}
}
return x;
}
function getYPos(item)
{
var y = 0;
if (item.offsetWidth)
{
while (item && item!=document.body)
{
y += item.offsetTop;
item = item.offsetParent;
}
}
return y;
}
/* A class handling everything associated with the search panel.
Parameters:
name - The name of the global variable that will be
storing this instance. Is needed to be able to set timeouts.
resultPath - path to use for external files
*/
function SearchBox(name, resultsPath, inFrame, label)
{
if (!name || !resultsPath) { alert("Missing parameters to SearchBox."); }
// ---------- Instance variables
this.name = name;
this.resultsPath = resultsPath;
this.keyTimeout = 0;
this.keyTimeoutLength = 500;
this.closeSelectionTimeout = 300;
this.lastSearchValue = "";
this.lastResultsPage = "";
this.hideTimeout = 0;
this.searchIndex = 0;
this.searchActive = false;
this.insideFrame = inFrame;
this.searchLabel = label;
// ----------- DOM Elements
this.DOMSearchField = function()
{ return document.getElementById("MSearchField"); }
this.DOMSearchSelect = function()
{ return document.getElementById("MSearchSelect"); }
this.DOMSearchSelectWindow = function()
{ return document.getElementById("MSearchSelectWindow"); }
this.DOMPopupSearchResults = function()
{ return document.getElementById("MSearchResults"); }
this.DOMPopupSearchResultsWindow = function()
{ return document.getElementById("MSearchResultsWindow"); }
this.DOMSearchClose = function()
{ return document.getElementById("MSearchClose"); }
this.DOMSearchBox = function()
{ return document.getElementById("MSearchBox"); }
// ------------ Event Handlers
// Called when focus is added or removed from the search field.
this.OnSearchFieldFocus = function(isActive)
{
this.Activate(isActive);
}
this.OnSearchSelectShow = function()
{
var searchSelectWindow = this.DOMSearchSelectWindow();
var searchField = this.DOMSearchSelect();
if (this.insideFrame)
{
var left = getXPos(searchField);
var top = getYPos(searchField);
left += searchField.offsetWidth + 6;
top += searchField.offsetHeight;
// show search selection popup
searchSelectWindow.style.display='block';
left -= searchSelectWindow.offsetWidth;
searchSelectWindow.style.left = left + 'px';
searchSelectWindow.style.top = top + 'px';
}
else
{
var left = getXPos(searchField);
var top = getYPos(searchField);
top += searchField.offsetHeight;
// show search selection popup
searchSelectWindow.style.display='block';
searchSelectWindow.style.left = left + 'px';
searchSelectWindow.style.top = top + 'px';
}
// stop selection hide timer
if (this.hideTimeout)
{
clearTimeout(this.hideTimeout);
this.hideTimeout=0;
}
return false; // to avoid "image drag" default event
}
this.OnSearchSelectHide = function()
{
this.hideTimeout = setTimeout(this.name +".CloseSelectionWindow()",
this.closeSelectionTimeout);
}
// Called when the content of the search field is changed.
this.OnSearchFieldChange = function(evt)
{
if (this.keyTimeout) // kill running timer
{
clearTimeout(this.keyTimeout);
this.keyTimeout = 0;
}
var e = (evt) ? evt : window.event; // for IE
if (e.keyCode==40 || e.keyCode==13)
{
if (e.shiftKey==1)
{
this.OnSearchSelectShow();
var win=this.DOMSearchSelectWindow();
for (i=0;i<win.childNodes.length;i++)
{
var child = win.childNodes[i]; // get span within a
if (child.className=='SelectItem')
{
child.focus();
return;
}
}
return;
}
else if (window.frames.MSearchResults.searchResults)
{
var elem = window.frames.MSearchResults.searchResults.NavNext(0);
if (elem) elem.focus();
}
}
else if (e.keyCode==27) // Escape out of the search field
{
this.DOMSearchField().blur();
this.DOMPopupSearchResultsWindow().style.display = 'none';
this.DOMSearchClose().style.display = 'none';
this.lastSearchValue = '';
this.Activate(false);
return;
}
// strip whitespaces
var searchValue = this.DOMSearchField().value.replace(/ +/g, "");
if (searchValue != this.lastSearchValue) // search value has changed
{
if (searchValue != "") // non-empty search
{
// set timer for search update
this.keyTimeout = setTimeout(this.name + '.Search()',
this.keyTimeoutLength);
}
else // empty search field
{
this.DOMPopupSearchResultsWindow().style.display = 'none';
this.DOMSearchClose().style.display = 'none';
this.lastSearchValue = '';
}
}
}
this.SelectItemCount = function(id)
{
var count=0;
var win=this.DOMSearchSelectWindow();
for (i=0;i<win.childNodes.length;i++)
{
var child = win.childNodes[i]; // get span within a
if (child.className=='SelectItem')
{
count++;
}
}
return count;
}
this.SelectItemSet = function(id)
{
var i,j=0;
var win=this.DOMSearchSelectWindow();
for (i=0;i<win.childNodes.length;i++)
{
var child = win.childNodes[i]; // get span within a
if (child.className=='SelectItem')
{
var node = child.firstChild;
if (j==id)
{
node.innerHTML='&#8226;';
}
else
{
node.innerHTML='&#160;';
}
j++;
}
}
}
// Called when an search filter selection is made.
// set item with index id as the active item
this.OnSelectItem = function(id)
{
this.searchIndex = id;
this.SelectItemSet(id);
var searchValue = this.DOMSearchField().value.replace(/ +/g, "");
if (searchValue!="" && this.searchActive) // something was found -> do a search
{
this.Search();
}
}
this.OnSearchSelectKey = function(evt)
{
var e = (evt) ? evt : window.event; // for IE
if (e.keyCode==40 && this.searchIndex<this.SelectItemCount()) // Down
{
this.searchIndex++;
this.OnSelectItem(this.searchIndex);
}
else if (e.keyCode==38 && this.searchIndex>0) // Up
{
this.searchIndex--;
this.OnSelectItem(this.searchIndex);
}
else if (e.keyCode==13 || e.keyCode==27)
{
this.OnSelectItem(this.searchIndex);
this.CloseSelectionWindow();
this.DOMSearchField().focus();
}
return false;
}
// --------- Actions
// Closes the results window.
this.CloseResultsWindow = function()
{
this.DOMPopupSearchResultsWindow().style.display = 'none';
this.DOMSearchClose().style.display = 'none';
this.Activate(false);
}
this.CloseSelectionWindow = function()
{
this.DOMSearchSelectWindow().style.display = 'none';
}
// Performs a search.
this.Search = function()
{
this.keyTimeout = 0;
// strip leading whitespace
var searchValue = this.DOMSearchField().value.replace(/^ +/, "");
var code = searchValue.toLowerCase().charCodeAt(0);
var idxChar = searchValue.substr(0, 1).toLowerCase();
if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair
{
idxChar = searchValue.substr(0, 2);
}
var resultsPage;
var resultsPageWithSearch;
var hasResultsPage;
var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar);
if (idx!=-1)
{
var hexCode=idx.toString(16);
resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + '.html';
resultsPageWithSearch = resultsPage+'?'+escape(searchValue);
hasResultsPage = true;
}
else // nothing available for this search term
{
resultsPage = this.resultsPath + '/nomatches.html';
resultsPageWithSearch = resultsPage;
hasResultsPage = false;
}
window.frames.MSearchResults.location = resultsPageWithSearch;
var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow();
if (domPopupSearchResultsWindow.style.display!='block')
{
var domSearchBox = this.DOMSearchBox();
this.DOMSearchClose().style.display = 'inline';
if (this.insideFrame)
{
var domPopupSearchResults = this.DOMPopupSearchResults();
domPopupSearchResultsWindow.style.position = 'relative';
domPopupSearchResultsWindow.style.display = 'block';
var width = document.body.clientWidth - 8; // the -8 is for IE :-(
domPopupSearchResultsWindow.style.width = width + 'px';
domPopupSearchResults.style.width = width + 'px';
}
else
{
var domPopupSearchResults = this.DOMPopupSearchResults();
var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth;
var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1;
domPopupSearchResultsWindow.style.display = 'block';
left -= domPopupSearchResults.offsetWidth;
domPopupSearchResultsWindow.style.top = top + 'px';
domPopupSearchResultsWindow.style.left = left + 'px';
}
}
this.lastSearchValue = searchValue;
this.lastResultsPage = resultsPage;
}
// -------- Activation Functions
// Activates or deactivates the search panel, resetting things to
// their default values if necessary.
this.Activate = function(isActive)
{
if (isActive || // open it
this.DOMPopupSearchResultsWindow().style.display == 'block'
)
{
this.DOMSearchBox().className = 'MSearchBoxActive';
var searchField = this.DOMSearchField();
if (searchField.value == this.searchLabel) // clear "Search" term upon entry
{
searchField.value = '';
this.searchActive = true;
}
}
else if (!isActive) // directly remove the panel
{
this.DOMSearchBox().className = 'MSearchBoxInactive';
this.DOMSearchField().value = this.searchLabel;
this.searchActive = false;
this.lastSearchValue = ''
this.lastResultsPage = '';
}
}
}
// -----------------------------------------------------------------------
// The class that handles everything on the search results page.
function SearchResults(name)
{
// The number of matches from the last run of <Search()>.
this.lastMatchCount = 0;
this.lastKey = 0;
this.repeatOn = false;
// Toggles the visibility of the passed element ID.
this.FindChildElement = function(id)
{
var parentElement = document.getElementById(id);
var element = parentElement.firstChild;
while (element && element!=parentElement)
{
if (element.nodeName == 'DIV' && element.className == 'SRChildren')
{
return element;
}
if (element.nodeName == 'DIV' && element.hasChildNodes())
{
element = element.firstChild;
}
else if (element.nextSibling)
{
element = element.nextSibling;
}
else
{
do
{
element = element.parentNode;
}
while (element && element!=parentElement && !element.nextSibling);
if (element && element!=parentElement)
{
element = element.nextSibling;
}
}
}
}
this.Toggle = function(id)
{
var element = this.FindChildElement(id);
if (element)
{
if (element.style.display == 'block')
{
element.style.display = 'none';
}
else
{
element.style.display = 'block';
}
}
}
// Searches for the passed string. If there is no parameter,
// it takes it from the URL query.
//
// Always returns true, since other documents may try to call it
// and that may or may not be possible.
this.Search = function(search)
{
if (!search) // get search word from URL
{
search = window.location.search;
search = search.substring(1); // Remove the leading '?'
search = unescape(search);
}
search = search.replace(/^ +/, ""); // strip leading spaces
search = search.replace(/ +$/, ""); // strip trailing spaces
search = search.toLowerCase();
search = convertToId(search);
var resultRows = document.getElementsByTagName("div");
var matches = 0;
var i = 0;
while (i < resultRows.length)
{
var row = resultRows.item(i);
if (row.className == "SRResult")
{
var rowMatchName = row.id.toLowerCase();
rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_'
if (search.length<=rowMatchName.length &&
rowMatchName.substr(0, search.length)==search)
{
row.style.display = 'block';
matches++;
}
else
{
row.style.display = 'none';
}
}
i++;
}
document.getElementById("Searching").style.display='none';
if (matches == 0) // no results
{
document.getElementById("NoMatches").style.display='block';
}
else // at least one result
{
document.getElementById("NoMatches").style.display='none';
}
this.lastMatchCount = matches;
return true;
}
// return the first item with index index or higher that is visible
this.NavNext = function(index)
{
var focusItem;
while (1)
{
var focusName = 'Item'+index;
focusItem = document.getElementById(focusName);
if (focusItem && focusItem.parentNode.parentNode.style.display=='block')
{
break;
}
else if (!focusItem) // last element
{
break;
}
focusItem=null;
index++;
}
return focusItem;
}
this.NavPrev = function(index)
{
var focusItem;
while (1)
{
var focusName = 'Item'+index;
focusItem = document.getElementById(focusName);
if (focusItem && focusItem.parentNode.parentNode.style.display=='block')
{
break;
}
else if (!focusItem) // last element
{
break;
}
focusItem=null;
index--;
}
return focusItem;
}
this.ProcessKeys = function(e)
{
if (e.type == "keydown")
{
this.repeatOn = false;
this.lastKey = e.keyCode;
}
else if (e.type == "keypress")
{
if (!this.repeatOn)
{
if (this.lastKey) this.repeatOn = true;
return false; // ignore first keypress after keydown
}
}
else if (e.type == "keyup")
{
this.lastKey = 0;
this.repeatOn = false;
}
return this.lastKey!=0;
}
this.Nav = function(evt,itemIndex)
{
var e = (evt) ? evt : window.event; // for IE
if (e.keyCode==13) return true;
if (!this.ProcessKeys(e)) return false;
if (this.lastKey==38) // Up
{
var newIndex = itemIndex-1;
var focusItem = this.NavPrev(newIndex);
if (focusItem)
{
var child = this.FindChildElement(focusItem.parentNode.parentNode.id);
if (child && child.style.display == 'block') // children visible
{
var n=0;
var tmpElem;
while (1) // search for last child
{
tmpElem = document.getElementById('Item'+newIndex+'_c'+n);
if (tmpElem)
{
focusItem = tmpElem;
}
else // found it!
{
break;
}
n++;
}
}
}
if (focusItem)
{
focusItem.focus();
}
else // return focus to search field
{
parent.document.getElementById("MSearchField").focus();
}
}
else if (this.lastKey==40) // Down
{
var newIndex = itemIndex+1;
var focusItem;
var item = document.getElementById('Item'+itemIndex);
var elem = this.FindChildElement(item.parentNode.parentNode.id);
if (elem && elem.style.display == 'block') // children visible
{
focusItem = document.getElementById('Item'+itemIndex+'_c0');
}
if (!focusItem) focusItem = this.NavNext(newIndex);
if (focusItem) focusItem.focus();
}
else if (this.lastKey==39) // Right
{
var item = document.getElementById('Item'+itemIndex);
var elem = this.FindChildElement(item.parentNode.parentNode.id);
if (elem) elem.style.display = 'block';
}
else if (this.lastKey==37) // Left
{
var item = document.getElementById('Item'+itemIndex);
var elem = this.FindChildElement(item.parentNode.parentNode.id);
if (elem) elem.style.display = 'none';
}
else if (this.lastKey==27) // Escape
{
parent.searchBox.CloseResultsWindow();
parent.document.getElementById("MSearchField").focus();
}
else if (this.lastKey==13) // Enter
{
return true;
}
return false;
}
this.NavChild = function(evt,itemIndex,childIndex)
{
var e = (evt) ? evt : window.event; // for IE
if (e.keyCode==13) return true;
if (!this.ProcessKeys(e)) return false;
if (this.lastKey==38) // Up
{
if (childIndex>0)
{
var newIndex = childIndex-1;
document.getElementById('Item'+itemIndex+'_c'+newIndex).focus();
}
else // already at first child, jump to parent
{
document.getElementById('Item'+itemIndex).focus();
}
}
else if (this.lastKey==40) // Down
{
var newIndex = childIndex+1;
var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex);
if (!elem) // last child, jump to parent next parent
{
elem = this.NavNext(itemIndex+1);
}
if (elem)
{
elem.focus();
}
}
else if (this.lastKey==27) // Escape
{
parent.searchBox.CloseResultsWindow();
parent.document.getElementById("MSearchField").focus();
}
else if (this.lastKey==13) // Enter
{
return true;
}
return false;
}
}
function setKeyActions(elem,action)
{
elem.setAttribute('onkeydown',action);
elem.setAttribute('onkeypress',action);
elem.setAttribute('onkeyup',action);
}
function setClassAttr(elem,attr)
{
elem.setAttribute('class',attr);
elem.setAttribute('className',attr);
}
function createResults()
{
var results = document.getElementById("SRResults");
for (var e=0; e<searchData.length; e++)
{
var id = searchData[e][0];
var srResult = document.createElement('div');
srResult.setAttribute('id','SR_'+id);
setClassAttr(srResult,'SRResult');
var srEntry = document.createElement('div');
setClassAttr(srEntry,'SREntry');
var srLink = document.createElement('a');
srLink.setAttribute('id','Item'+e);
setKeyActions(srLink,'return searchResults.Nav(event,'+e+')');
setClassAttr(srLink,'SRSymbol');
srLink.innerHTML = searchData[e][1][0];
srEntry.appendChild(srLink);
if (searchData[e][1].length==2) // single result
{
srLink.setAttribute('href',searchData[e][1][1][0]);
if (searchData[e][1][1][1])
{
srLink.setAttribute('target','_parent');
}
var srScope = document.createElement('span');
setClassAttr(srScope,'SRScope');
srScope.innerHTML = searchData[e][1][1][2];
srEntry.appendChild(srScope);
}
else // multiple results
{
srLink.setAttribute('href','javascript:searchResults.Toggle("SR_'+id+'")');
var srChildren = document.createElement('div');
setClassAttr(srChildren,'SRChildren');
for (var c=0; c<searchData[e][1].length-1; c++)
{
var srChild = document.createElement('a');
srChild.setAttribute('id','Item'+e+'_c'+c);
setKeyActions(srChild,'return searchResults.NavChild(event,'+e+','+c+')');
setClassAttr(srChild,'SRScope');
srChild.setAttribute('href',searchData[e][1][c+1][0]);
if (searchData[e][1][c+1][1])
{
srChild.setAttribute('target','_parent');
}
srChild.innerHTML = searchData[e][1][c+1][2];
srChildren.appendChild(srChild);
}
srEntry.appendChild(srChildren);
}
srResult.appendChild(srEntry);
results.appendChild(srResult);
}
}
function init_search()
{
var results = document.getElementById("MSearchSelectWindow");
for (var key in indexSectionLabels)
{
var link = document.createElement('a');
link.setAttribute('class','SelectItem');
link.setAttribute('onclick','searchBox.OnSelectItem('+key+')');
link.href='javascript:void(0)';
link.innerHTML='<span class="SelectionMark">&#160;</span>'+indexSectionLabels[key];
results.appendChild(link);
}
searchBox.OnSelectItem(0);
}
/* @license-end */

Binary file not shown.

After

Width:  |  Height:  |  Size: 567 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 158 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 553 B

View File

@@ -0,0 +1,12 @@
var indexSectionsWithContent =
{
};
var indexSectionNames =
{
};
var indexSectionLabels =
{
};

Binary file not shown.

After

Width:  |  Height:  |  Size: 314 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 853 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 845 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 142 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 169 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 177 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 184 B

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,23 @@
LATEX_CMD=pdflatex
all: refman.pdf
pdf: refman.pdf
refman.pdf: clean refman.tex
$(LATEX_CMD) refman
makeindex refman.idx
$(LATEX_CMD) refman
latex_count=8 ; \
while egrep -s 'Rerun (LaTeX|to get cross-references right)' refman.log && [ $$latex_count -gt 0 ] ;\
do \
echo "Rerunning latex...." ;\
$(LATEX_CMD) refman ;\
latex_count=`expr $$latex_count - 1` ;\
done
makeindex refman.idx
$(LATEX_CMD) refman
clean:
rm -f *.ps *.dvi *.aux *.toc *.idx *.ind *.ilg *.log *.out *.brf *.blg *.bbl refman.pdf

View File

@@ -0,0 +1,576 @@
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{doxygen}
% Packages used by this style file
\RequirePackage{alltt}
%%\RequirePackage{array} %% moved to refman.tex due to workaround for LaTex 2019 version and unmaintained tabu package
\RequirePackage{calc}
\RequirePackage{float}
%%\RequirePackage{ifthen} %% moved to refman.tex due to workaround for LaTex 2019 version and unmaintained tabu package
\RequirePackage{verbatim}
\RequirePackage[table]{xcolor}
\RequirePackage{longtable_doxygen}
\RequirePackage{tabu_doxygen}
\RequirePackage{fancyvrb}
\RequirePackage{tabularx}
\RequirePackage{multirow}
\RequirePackage{hanging}
\RequirePackage{ifpdf}
\RequirePackage{adjustbox}
\RequirePackage{amssymb}
\RequirePackage{stackengine}
\RequirePackage[normalem]{ulem} % for strikeout, but don't modify emphasis
%---------- Internal commands used in this style file ----------------
\newcommand{\ensurespace}[1]{%
\begingroup%
\setlength{\dimen@}{#1}%
\vskip\z@\@plus\dimen@%
\penalty -100\vskip\z@\@plus -\dimen@%
\vskip\dimen@%
\penalty 9999%
\vskip -\dimen@%
\vskip\z@skip% hide the previous |\vskip| from |\addvspace|
\endgroup%
}
\newcommand{\DoxyHorRuler}[1]{%
\setlength{\parskip}{0ex plus 0ex minus 0ex}%
\ifthenelse{#1=0}%
{%
\hrule%
}%
{%
\hrulefilll%
}%
}
\newcommand{\DoxyLabelFont}{}
\newcommand{\entrylabel}[1]{%
{%
\parbox[b]{\labelwidth-4pt}{%
\makebox[0pt][l]{\DoxyLabelFont#1}%
\vspace{1.5\baselineskip}%
}%
}%
}
\newenvironment{DoxyDesc}[1]{%
\ensurespace{4\baselineskip}%
\begin{list}{}{%
\settowidth{\labelwidth}{20pt}%
%\setlength{\parsep}{0pt}%
\setlength{\itemsep}{0pt}%
\setlength{\leftmargin}{\labelwidth+\labelsep}%
\renewcommand{\makelabel}{\entrylabel}%
}%
\item[#1]%
}{%
\end{list}%
}
\newsavebox{\xrefbox}
\newlength{\xreflength}
\newcommand{\xreflabel}[1]{%
\sbox{\xrefbox}{#1}%
\setlength{\xreflength}{\wd\xrefbox}%
\ifthenelse{\xreflength>\labelwidth}{%
\begin{minipage}{\textwidth}%
\setlength{\parindent}{0pt}%
\hangindent=15pt\bfseries #1\vspace{1.2\itemsep}%
\end{minipage}%
}{%
\parbox[b]{\labelwidth}{\makebox[0pt][l]{\textbf{#1}}}%
}%
}
%---------- Commands used by doxygen LaTeX output generator ----------
% Used by <pre> ... </pre>
\newenvironment{DoxyPre}{%
\small%
\begin{alltt}%
}{%
\end{alltt}%
\normalsize%
}
% Necessary for redefining not defined characters, i.e. "Replacement Character" in tex output.
\newlength{\CodeWidthChar}
\newlength{\CodeHeightChar}
\settowidth{\CodeWidthChar}{?}
\settoheight{\CodeHeightChar}{?}
% Necessary for hanging indent
\newlength{\DoxyCodeWidth}
\newcommand\DoxyCodeLine[1]{\hangpara{\DoxyCodeWidth}{1}{#1}\par}
\newcommand\NiceSpace{%
\discretionary{}{\kern\fontdimen2\font}{\kern\fontdimen2\font}%
}
% Used by @code ... @endcode
\newenvironment{DoxyCode}[1]{%
\par%
\scriptsize%
\normalfont\ttfamily%
\rightskip0pt plus 1fil%
\settowidth{\DoxyCodeWidth}{000000}%
\settowidth{\CodeWidthChar}{?}%
\settoheight{\CodeHeightChar}{?}%
\setlength{\parskip}{0ex plus 0ex minus 0ex}%
\ifthenelse{\equal{#1}{0}}
{
{\lccode`~32 \lowercase{\global\let~}\NiceSpace}\obeyspaces%
}
{
{\lccode`~32 \lowercase{\global\let~}}\obeyspaces%
}
}{%
\normalfont%
\normalsize%
\settowidth{\CodeWidthChar}{?}%
\settoheight{\CodeHeightChar}{?}%
}
% Redefining not defined characters, i.e. "Replacement Character" in tex output.
\def\ucr{\adjustbox{width=\CodeWidthChar,height=\CodeHeightChar}{\stackinset{c}{}{c}{-.2pt}{%
\textcolor{white}{\sffamily\bfseries\small ?}}{%
\rotatebox{45}{$\blacksquare$}}}}
% Used by @example, @include, @includelineno and @dontinclude
\newenvironment{DoxyCodeInclude}[1]{%
\DoxyCode{#1}%
}{%
\endDoxyCode%
}
% Used by @verbatim ... @endverbatim
\newenvironment{DoxyVerb}{%
\footnotesize%
\verbatim%
}{%
\endverbatim%
\normalsize%
}
% Used by @verbinclude
\newenvironment{DoxyVerbInclude}{%
\DoxyVerb%
}{%
\endDoxyVerb%
}
% Used by numbered lists (using '-#' or <ol> ... </ol>)
\newenvironment{DoxyEnumerate}{%
\enumerate%
}{%
\endenumerate%
}
% Used by bullet lists (using '-', @li, @arg, or <ul> ... </ul>)
\newenvironment{DoxyItemize}{%
\itemize%
}{%
\enditemize%
}
% Used by description lists (using <dl> ... </dl>)
\newenvironment{DoxyDescription}{%
\description%
}{%
\enddescription%
}
% Used by @image, @dotfile, @dot ... @enddot, and @msc ... @endmsc
% (only if caption is specified)
\newenvironment{DoxyImage}{%
\begin{figure}[H]%
\begin{center}%
}{%
\end{center}%
\end{figure}%
}
% Used by @image, @dotfile, @dot ... @enddot, and @msc ... @endmsc
% (only if no caption is specified)
\newenvironment{DoxyImageNoCaption}{%
\begin{center}%
}{%
\end{center}%
}
% Used by @image
% (only if inline is specified)
\newenvironment{DoxyInlineImage}{%
}{%
}
% Used by @attention
\newenvironment{DoxyAttention}[1]{%
\begin{DoxyDesc}{#1}%
}{%
\end{DoxyDesc}%
}
% Used by @author and @authors
\newenvironment{DoxyAuthor}[1]{%
\begin{DoxyDesc}{#1}%
}{%
\end{DoxyDesc}%
}
% Used by @date
\newenvironment{DoxyDate}[1]{%
\begin{DoxyDesc}{#1}%
}{%
\end{DoxyDesc}%
}
% Used by @invariant
\newenvironment{DoxyInvariant}[1]{%
\begin{DoxyDesc}{#1}%
}{%
\end{DoxyDesc}%
}
% Used by @note
\newenvironment{DoxyNote}[1]{%
\begin{DoxyDesc}{#1}%
}{%
\end{DoxyDesc}%
}
% Used by @post
\newenvironment{DoxyPostcond}[1]{%
\begin{DoxyDesc}{#1}%
}{%
\end{DoxyDesc}%
}
% Used by @pre
\newenvironment{DoxyPrecond}[1]{%
\begin{DoxyDesc}{#1}%
}{%
\end{DoxyDesc}%
}
% Used by @copyright
\newenvironment{DoxyCopyright}[1]{%
\begin{DoxyDesc}{#1}%
}{%
\end{DoxyDesc}%
}
% Used by @remark
\newenvironment{DoxyRemark}[1]{%
\begin{DoxyDesc}{#1}%
}{%
\end{DoxyDesc}%
}
% Used by @return and @returns
\newenvironment{DoxyReturn}[1]{%
\begin{DoxyDesc}{#1}%
}{%
\end{DoxyDesc}%
}
% Used by @since
\newenvironment{DoxySince}[1]{%
\begin{DoxyDesc}{#1}%
}{%
\end{DoxyDesc}%
}
% Used by @see
\newenvironment{DoxySeeAlso}[1]{%
\begin{DoxyDesc}{#1}%
}{%
\end{DoxyDesc}%
}
% Used by @version
\newenvironment{DoxyVersion}[1]{%
\begin{DoxyDesc}{#1}%
}{%
\end{DoxyDesc}%
}
% Used by @warning
\newenvironment{DoxyWarning}[1]{%
\begin{DoxyDesc}{#1}%
}{%
\end{DoxyDesc}%
}
% Used by @internal
\newenvironment{DoxyInternal}[1]{%
\paragraph*{#1}%
}{%
}
% Used by @par and @paragraph
\newenvironment{DoxyParagraph}[1]{%
\begin{DoxyDesc}{#1}%
}{%
\end{DoxyDesc}%
}
% Used by parameter lists
\newenvironment{DoxyParams}[2][]{%
\tabulinesep=1mm%
\par%
\ifthenelse{\equal{#1}{}}%
{\begin{longtabu*}spread 0pt [l]{|X[-1,l]|X[-1,l]|}}% name + description
{\ifthenelse{\equal{#1}{1}}%
{\begin{longtabu*}spread 0pt [l]{|X[-1,l]|X[-1,l]|X[-1,l]|}}% in/out + name + desc
{\begin{longtabu*}spread 0pt [l]{|X[-1,l]|X[-1,l]|X[-1,l]|X[-1,l]|}}% in/out + type + name + desc
}
\multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #2}\\[1ex]%
\hline%
\endfirsthead%
\multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #2}\\[1ex]%
\hline%
\endhead%
}{%
\end{longtabu*}%
\vspace{6pt}%
}
% Used for fields of simple structs
\newenvironment{DoxyFields}[1]{%
\tabulinesep=1mm%
\par%
\begin{longtabu*}spread 0pt [l]{|X[-1,r]|X[-1,l]|X[-1,l]|}%
\multicolumn{3}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]%
\hline%
\endfirsthead%
\multicolumn{3}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]%
\hline%
\endhead%
}{%
\end{longtabu*}%
\vspace{6pt}%
}
% Used for fields simple class style enums
\newenvironment{DoxyEnumFields}[1]{%
\tabulinesep=1mm%
\par%
\begin{longtabu*}spread 0pt [l]{|X[-1,r]|X[-1,l]|}%
\multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]%
\hline%
\endfirsthead%
\multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]%
\hline%
\endhead%
}{%
\end{longtabu*}%
\vspace{6pt}%
}
% Used for parameters within a detailed function description
\newenvironment{DoxyParamCaption}{%
\renewcommand{\item}[2][]{\\ \hspace*{2.0cm} ##1 {\em ##2}}%
}{%
}
% Used by return value lists
\newenvironment{DoxyRetVals}[1]{%
\tabulinesep=1mm%
\par%
\begin{longtabu*}spread 0pt [l]{|X[-1,r]|X[-1,l]|}%
\multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]%
\hline%
\endfirsthead%
\multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]%
\hline%
\endhead%
}{%
\end{longtabu*}%
\vspace{6pt}%
}
% Used by exception lists
\newenvironment{DoxyExceptions}[1]{%
\tabulinesep=1mm%
\par%
\begin{longtabu*}spread 0pt [l]{|X[-1,r]|X[-1,l]|}%
\multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]%
\hline%
\endfirsthead%
\multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]%
\hline%
\endhead%
}{%
\end{longtabu*}%
\vspace{6pt}%
}
% Used by template parameter lists
\newenvironment{DoxyTemplParams}[1]{%
\tabulinesep=1mm%
\par%
\begin{longtabu*}spread 0pt [l]{|X[-1,r]|X[-1,l]|}%
\multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]%
\hline%
\endfirsthead%
\multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]%
\hline%
\endhead%
}{%
\end{longtabu*}%
\vspace{6pt}%
}
% Used for member lists
\newenvironment{DoxyCompactItemize}{%
\begin{itemize}%
\setlength{\itemsep}{-3pt}%
\setlength{\parsep}{0pt}%
\setlength{\topsep}{0pt}%
\setlength{\partopsep}{0pt}%
}{%
\end{itemize}%
}
% Used for member descriptions
\newenvironment{DoxyCompactList}{%
\begin{list}{}{%
\setlength{\leftmargin}{0.5cm}%
\setlength{\itemsep}{0pt}%
\setlength{\parsep}{0pt}%
\setlength{\topsep}{0pt}%
\renewcommand{\makelabel}{\hfill}%
}%
}{%
\end{list}%
}
% Used for reference lists (@bug, @deprecated, @todo, etc.)
\newenvironment{DoxyRefList}{%
\begin{list}{}{%
\setlength{\labelwidth}{10pt}%
\setlength{\leftmargin}{\labelwidth}%
\addtolength{\leftmargin}{\labelsep}%
\renewcommand{\makelabel}{\xreflabel}%
}%
}{%
\end{list}%
}
% Used by @bug, @deprecated, @todo, etc.
\newenvironment{DoxyRefDesc}[1]{%
\begin{list}{}{%
\renewcommand\makelabel[1]{\textbf{##1}}%
\settowidth\labelwidth{\makelabel{#1}}%
\setlength\leftmargin{\labelwidth+\labelsep}%
}%
}{%
\end{list}%
}
% Used by parameter lists and simple sections
\newenvironment{Desc}
{\begin{list}{}{%
\settowidth{\labelwidth}{20pt}%
\setlength{\parsep}{0pt}%
\setlength{\itemsep}{0pt}%
\setlength{\leftmargin}{\labelwidth+\labelsep}%
\renewcommand{\makelabel}{\entrylabel}%
}
}{%
\end{list}%
}
% Used by tables
\newcommand{\PBS}[1]{\let\temp=\\#1\let\\=\temp}%
\newenvironment{TabularC}[1]%
{\tabulinesep=1mm
\begin{longtabu*}spread 0pt [c]{*#1{|X[-1]}|}}%
{\end{longtabu*}\par}%
\newenvironment{TabularNC}[1]%
{\begin{tabu}spread 0pt [l]{*#1{|X[-1]}|}}%
{\end{tabu}\par}%
% Used for member group headers
\newenvironment{Indent}{%
\begin{list}{}{%
\setlength{\leftmargin}{0.5cm}%
}%
\item[]\ignorespaces%
}{%
\unskip%
\end{list}%
}
% Used when hyperlinks are turned off
\newcommand{\doxyref}[3]{%
\textbf{#1} (\textnormal{#2}\,\pageref{#3})%
}
% Used to link to a table when hyperlinks are turned on
\newcommand{\doxytablelink}[2]{%
\ref{#1}%
}
% Used to link to a table when hyperlinks are turned off
\newcommand{\doxytableref}[3]{%
\ref{#3}%
}
% Used by @addindex
\newcommand{\lcurly}{\{}
\newcommand{\rcurly}{\}}
% Colors used for syntax highlighting
\definecolor{comment}{rgb}{0.5,0.0,0.0}
\definecolor{keyword}{rgb}{0.0,0.5,0.0}
\definecolor{keywordtype}{rgb}{0.38,0.25,0.125}
\definecolor{keywordflow}{rgb}{0.88,0.5,0.0}
\definecolor{preprocessor}{rgb}{0.5,0.38,0.125}
\definecolor{stringliteral}{rgb}{0.0,0.125,0.25}
\definecolor{charliteral}{rgb}{0.0,0.5,0.5}
\definecolor{vhdldigit}{rgb}{1.0,0.0,1.0}
\definecolor{vhdlkeyword}{rgb}{0.43,0.0,0.43}
\definecolor{vhdllogic}{rgb}{1.0,0.0,0.0}
\definecolor{vhdlchar}{rgb}{0.0,0.0,0.0}
% Color used for table heading
\newcommand{\tableheadbgcolor}{lightgray}%
% Version of hypertarget with correct landing location
\newcommand{\Hypertarget}[1]{\Hy@raisedlink{\hypertarget{#1}{}}}
% possibility to have sections etc. be within the margins
% unfortunately had to copy part of book.cls and add \raggedright
\makeatletter
\newcommand\doxysection{\@startsection {section}{1}{\z@}%
{-3.5ex \@plus -1ex \@minus -.2ex}%
{2.3ex \@plus.2ex}%
{\raggedright\normalfont\Large\bfseries}}
\newcommand\doxysubsection{\@startsection{subsection}{2}{\z@}%
{-3.25ex\@plus -1ex \@minus -.2ex}%
{1.5ex \@plus .2ex}%
{\raggedright\normalfont\large\bfseries}}
\newcommand\doxysubsubsection{\@startsection{subsubsection}{3}{\z@}%
{-3.25ex\@plus -1ex \@minus -.2ex}%
{1.5ex \@plus .2ex}%
{\raggedright\normalfont\normalsize\bfseries}}
\newcommand\doxyparagraph{\@startsection{paragraph}{4}{\z@}%
{3.25ex \@plus1ex \@minus.2ex}%
{-1em}%
{\raggedright\normalfont\normalsize\bfseries}}
\newcommand\doxysubparagraph{\@startsection{subparagraph}{5}{\parindent}%
{3.25ex \@plus1ex \@minus .2ex}%
{-1em}%
{\raggedright\normalfont\normalsize\bfseries}}
\makeatother
% Define caption that is also suitable in a table
\makeatletter
\def\doxyfigcaption{%
\refstepcounter{figure}%
\@dblarg{\@caption{figure}}}
\makeatother

View File

@@ -0,0 +1,448 @@
%%
%% This is file `longtable.sty',
%% generated with the docstrip utility.
%%
%% The original source files were:
%%
%% longtable.dtx (with options: `package')
%%
%% This is a generated file.
%%
%% The source is maintained by the LaTeX Project team and bug
%% reports for it can be opened at http://latex-project.org/bugs.html
%% (but please observe conditions on bug reports sent to that address!)
%%
%% Copyright 1993-2016
%% The LaTeX3 Project and any individual authors listed elsewhere
%% in this file.
%%
%% This file was generated from file(s) of the Standard LaTeX `Tools Bundle'.
%% --------------------------------------------------------------------------
%%
%% It may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License, either version 1.3c
%% of this license or (at your option) any later version.
%% The latest version of this license is in
%% http://www.latex-project.org/lppl.txt
%% and version 1.3c or later is part of all distributions of LaTeX
%% version 2005/12/01 or later.
%%
%% This file may only be distributed together with a copy of the LaTeX
%% `Tools Bundle'. You may however distribute the LaTeX `Tools Bundle'
%% without such generated files.
%%
%% The list of all files belonging to the LaTeX `Tools Bundle' is
%% given in the file `manifest.txt'.
%%
%% File: longtable.dtx Copyright (C) 1990-2001 David Carlisle
\NeedsTeXFormat{LaTeX2e}[1995/06/01]
\ProvidesPackage{longtable_doxygen}
[2014/10/28 v4.11 Multi-page Table package (DPC) - frozen version for doxygen]
\def\LT@err{\PackageError{longtable}}
\def\LT@warn{\PackageWarning{longtable}}
\def\LT@final@warn{%
\AtEndDocument{%
\LT@warn{Table \@width s have changed. Rerun LaTeX.\@gobbletwo}}%
\global\let\LT@final@warn\relax}
\DeclareOption{errorshow}{%
\def\LT@warn{\PackageInfo{longtable}}}
\DeclareOption{pausing}{%
\def\LT@warn#1{%
\LT@err{#1}{This is not really an error}}}
\DeclareOption{set}{}
\DeclareOption{final}{}
\ProcessOptions
\newskip\LTleft \LTleft=\fill
\newskip\LTright \LTright=\fill
\newskip\LTpre \LTpre=\bigskipamount
\newskip\LTpost \LTpost=\bigskipamount
\newcount\LTchunksize \LTchunksize=20
\let\c@LTchunksize\LTchunksize
\newdimen\LTcapwidth \LTcapwidth=4in
\newbox\LT@head
\newbox\LT@firsthead
\newbox\LT@foot
\newbox\LT@lastfoot
\newcount\LT@cols
\newcount\LT@rows
\newcounter{LT@tables}
\newcounter{LT@chunks}[LT@tables]
\ifx\c@table\undefined
\newcounter{table}
\def\fnum@table{\tablename~\thetable}
\fi
\ifx\tablename\undefined
\def\tablename{Table}
\fi
\newtoks\LT@p@ftn
\mathchardef\LT@end@pen=30000
\def\longtable{%
\par
\ifx\multicols\@undefined
\else
\ifnum\col@number>\@ne
\@twocolumntrue
\fi
\fi
\if@twocolumn
\LT@err{longtable not in 1-column mode}\@ehc
\fi
\begingroup
\@ifnextchar[\LT@array{\LT@array[x]}}
\def\LT@array[#1]#2{%
\refstepcounter{table}\stepcounter{LT@tables}%
\if l#1%
\LTleft\z@ \LTright\fill
\else\if r#1%
\LTleft\fill \LTright\z@
\else\if c#1%
\LTleft\fill \LTright\fill
\fi\fi\fi
\let\LT@mcol\multicolumn
\let\LT@@tabarray\@tabarray
\let\LT@@hl\hline
\def\@tabarray{%
\let\hline\LT@@hl
\LT@@tabarray}%
\let\\\LT@tabularcr\let\tabularnewline\\%
\def\newpage{\noalign{\break}}%
\def\pagebreak{\noalign{\ifnum`}=0\fi\@testopt{\LT@no@pgbk-}4}%
\def\nopagebreak{\noalign{\ifnum`}=0\fi\@testopt\LT@no@pgbk4}%
\let\hline\LT@hline \let\kill\LT@kill\let\caption\LT@caption
\@tempdima\ht\strutbox
\let\@endpbox\LT@endpbox
\ifx\extrarowheight\@undefined
\let\@acol\@tabacol
\let\@classz\@tabclassz \let\@classiv\@tabclassiv
\def\@startpbox{\vtop\LT@startpbox}%
\let\@@startpbox\@startpbox
\let\@@endpbox\@endpbox
\let\LT@LL@FM@cr\@tabularcr
\else
\advance\@tempdima\extrarowheight
\col@sep\tabcolsep
\let\@startpbox\LT@startpbox\let\LT@LL@FM@cr\@arraycr
\fi
\setbox\@arstrutbox\hbox{\vrule
\@height \arraystretch \@tempdima
\@depth \arraystretch \dp \strutbox
\@width \z@}%
\let\@sharp##\let\protect\relax
\begingroup
\@mkpream{#2}%
\xdef\LT@bchunk{%
\global\advance\c@LT@chunks\@ne
\global\LT@rows\z@\setbox\z@\vbox\bgroup
\LT@setprevdepth
\tabskip\LTleft \noexpand\halign to\hsize\bgroup
\tabskip\z@ \@arstrut \@preamble \tabskip\LTright \cr}%
\endgroup
\expandafter\LT@nofcols\LT@bchunk&\LT@nofcols
\LT@make@row
\m@th\let\par\@empty
\everycr{}\lineskip\z@\baselineskip\z@
\LT@bchunk}
\def\LT@no@pgbk#1[#2]{\penalty #1\@getpen{#2}\ifnum`{=0\fi}}
\def\LT@start{%
\let\LT@start\endgraf
\endgraf\penalty\z@\vskip\LTpre
\dimen@\pagetotal
\advance\dimen@ \ht\ifvoid\LT@firsthead\LT@head\else\LT@firsthead\fi
\advance\dimen@ \dp\ifvoid\LT@firsthead\LT@head\else\LT@firsthead\fi
\advance\dimen@ \ht\LT@foot
\dimen@ii\vfuzz
\vfuzz\maxdimen
\setbox\tw@\copy\z@
\setbox\tw@\vsplit\tw@ to \ht\@arstrutbox
\setbox\tw@\vbox{\unvbox\tw@}%
\vfuzz\dimen@ii
\advance\dimen@ \ht
\ifdim\ht\@arstrutbox>\ht\tw@\@arstrutbox\else\tw@\fi
\advance\dimen@\dp
\ifdim\dp\@arstrutbox>\dp\tw@\@arstrutbox\else\tw@\fi
\advance\dimen@ -\pagegoal
\ifdim \dimen@>\z@\vfil\break\fi
\global\@colroom\@colht
\ifvoid\LT@foot\else
\advance\vsize-\ht\LT@foot
\global\advance\@colroom-\ht\LT@foot
\dimen@\pagegoal\advance\dimen@-\ht\LT@foot\pagegoal\dimen@
\maxdepth\z@
\fi
\ifvoid\LT@firsthead\copy\LT@head\else\box\LT@firsthead\fi\nobreak
\output{\LT@output}}
\def\endlongtable{%
\crcr
\noalign{%
\let\LT@entry\LT@entry@chop
\xdef\LT@save@row{\LT@save@row}}%
\LT@echunk
\LT@start
\unvbox\z@
\LT@get@widths
\if@filesw
{\let\LT@entry\LT@entry@write\immediate\write\@auxout{%
\gdef\expandafter\noexpand
\csname LT@\romannumeral\c@LT@tables\endcsname
{\LT@save@row}}}%
\fi
\ifx\LT@save@row\LT@@save@row
\else
\LT@warn{Column \@width s have changed\MessageBreak
in table \thetable}%
\LT@final@warn
\fi
\endgraf\penalty -\LT@end@pen
\endgroup
\global\@mparbottom\z@
\pagegoal\vsize
\endgraf\penalty\z@\addvspace\LTpost
\ifvoid\footins\else\insert\footins{}\fi}
\def\LT@nofcols#1&{%
\futurelet\@let@token\LT@n@fcols}
\def\LT@n@fcols{%
\advance\LT@cols\@ne
\ifx\@let@token\LT@nofcols
\expandafter\@gobble
\else
\expandafter\LT@nofcols
\fi}
\def\LT@tabularcr{%
\relax\iffalse{\fi\ifnum0=`}\fi
\@ifstar
{\def\crcr{\LT@crcr\noalign{\nobreak}}\let\cr\crcr
\LT@t@bularcr}%
{\LT@t@bularcr}}
\let\LT@crcr\crcr
\let\LT@setprevdepth\relax
\def\LT@t@bularcr{%
\global\advance\LT@rows\@ne
\ifnum\LT@rows=\LTchunksize
\gdef\LT@setprevdepth{%
\prevdepth\z@\global
\global\let\LT@setprevdepth\relax}%
\expandafter\LT@xtabularcr
\else
\ifnum0=`{}\fi
\expandafter\LT@LL@FM@cr
\fi}
\def\LT@xtabularcr{%
\@ifnextchar[\LT@argtabularcr\LT@ntabularcr}
\def\LT@ntabularcr{%
\ifnum0=`{}\fi
\LT@echunk
\LT@start
\unvbox\z@
\LT@get@widths
\LT@bchunk}
\def\LT@argtabularcr[#1]{%
\ifnum0=`{}\fi
\ifdim #1>\z@
\unskip\@xargarraycr{#1}%
\else
\@yargarraycr{#1}%
\fi
\LT@echunk
\LT@start
\unvbox\z@
\LT@get@widths
\LT@bchunk}
\def\LT@echunk{%
\crcr\LT@save@row\cr\egroup
\global\setbox\@ne\lastbox
\unskip
\egroup}
\def\LT@entry#1#2{%
\ifhmode\@firstofone{&}\fi\omit
\ifnum#1=\c@LT@chunks
\else
\kern#2\relax
\fi}
\def\LT@entry@chop#1#2{%
\noexpand\LT@entry
{\ifnum#1>\c@LT@chunks
1}{0pt%
\else
#1}{#2%
\fi}}
\def\LT@entry@write{%
\noexpand\LT@entry^^J%
\@spaces}
\def\LT@kill{%
\LT@echunk
\LT@get@widths
\expandafter\LT@rebox\LT@bchunk}
\def\LT@rebox#1\bgroup{%
#1\bgroup
\unvbox\z@
\unskip
\setbox\z@\lastbox}
\def\LT@blank@row{%
\xdef\LT@save@row{\expandafter\LT@build@blank
\romannumeral\number\LT@cols 001 }}
\def\LT@build@blank#1{%
\if#1m%
\noexpand\LT@entry{1}{0pt}%
\expandafter\LT@build@blank
\fi}
\def\LT@make@row{%
\global\expandafter\let\expandafter\LT@save@row
\csname LT@\romannumeral\c@LT@tables\endcsname
\ifx\LT@save@row\relax
\LT@blank@row
\else
{\let\LT@entry\or
\if!%
\ifcase\expandafter\expandafter\expandafter\LT@cols
\expandafter\@gobble\LT@save@row
\or
\else
\relax
\fi
!%
\else
\aftergroup\LT@blank@row
\fi}%
\fi}
\let\setlongtables\relax
\def\LT@get@widths{%
\setbox\tw@\hbox{%
\unhbox\@ne
\let\LT@old@row\LT@save@row
\global\let\LT@save@row\@empty
\count@\LT@cols
\loop
\unskip
\setbox\tw@\lastbox
\ifhbox\tw@
\LT@def@row
\advance\count@\m@ne
\repeat}%
\ifx\LT@@save@row\@undefined
\let\LT@@save@row\LT@save@row
\fi}
\def\LT@def@row{%
\let\LT@entry\or
\edef\@tempa{%
\ifcase\expandafter\count@\LT@old@row
\else
{1}{0pt}%
\fi}%
\let\LT@entry\relax
\xdef\LT@save@row{%
\LT@entry
\expandafter\LT@max@sel\@tempa
\LT@save@row}}
\def\LT@max@sel#1#2{%
{\ifdim#2=\wd\tw@
#1%
\else
\number\c@LT@chunks
\fi}%
{\the\wd\tw@}}
\def\LT@hline{%
\noalign{\ifnum0=`}\fi
\penalty\@M
\futurelet\@let@token\LT@@hline}
\def\LT@@hline{%
\ifx\@let@token\hline
\global\let\@gtempa\@gobble
\gdef\LT@sep{\penalty-\@medpenalty\vskip\doublerulesep}%
\else
\global\let\@gtempa\@empty
\gdef\LT@sep{\penalty-\@lowpenalty\vskip-\arrayrulewidth}%
\fi
\ifnum0=`{\fi}%
\multispan\LT@cols
\unskip\leaders\hrule\@height\arrayrulewidth\hfill\cr
\noalign{\LT@sep}%
\multispan\LT@cols
\unskip\leaders\hrule\@height\arrayrulewidth\hfill\cr
\noalign{\penalty\@M}%
\@gtempa}
\def\LT@caption{%
\noalign\bgroup
\@ifnextchar[{\egroup\LT@c@ption\@firstofone}\LT@capti@n}
\def\LT@c@ption#1[#2]#3{%
\LT@makecaption#1\fnum@table{#3}%
\def\@tempa{#2}%
\ifx\@tempa\@empty\else
{\let\\\space
\addcontentsline{lot}{table}{\protect\numberline{\thetable}{#2}}}%
\fi}
\def\LT@capti@n{%
\@ifstar
{\egroup\LT@c@ption\@gobble[]}%
{\egroup\@xdblarg{\LT@c@ption\@firstofone}}}
\def\LT@makecaption#1#2#3{%
\LT@mcol\LT@cols c{\hbox to\z@{\hss\parbox[t]\LTcapwidth{%
\sbox\@tempboxa{#1{#2: }#3}%
\ifdim\wd\@tempboxa>\hsize
#1{#2: }#3%
\else
\hbox to\hsize{\hfil\box\@tempboxa\hfil}%
\fi
\endgraf\vskip\baselineskip}%
\hss}}}
\def\LT@output{%
\ifnum\outputpenalty <-\@Mi
\ifnum\outputpenalty > -\LT@end@pen
\LT@err{floats and marginpars not allowed in a longtable}\@ehc
\else
\setbox\z@\vbox{\unvbox\@cclv}%
\ifdim \ht\LT@lastfoot>\ht\LT@foot
\dimen@\pagegoal
\advance\dimen@-\ht\LT@lastfoot
\ifdim\dimen@<\ht\z@
\setbox\@cclv\vbox{\unvbox\z@\copy\LT@foot\vss}%
\@makecol
\@outputpage
\setbox\z@\vbox{\box\LT@head}%
\fi
\fi
\global\@colroom\@colht
\global\vsize\@colht
\vbox
{\unvbox\z@\box\ifvoid\LT@lastfoot\LT@foot\else\LT@lastfoot\fi}%
\fi
\else
\setbox\@cclv\vbox{\unvbox\@cclv\copy\LT@foot\vss}%
\@makecol
\@outputpage
\global\vsize\@colroom
\copy\LT@head\nobreak
\fi}
\def\LT@end@hd@ft#1{%
\LT@echunk
\ifx\LT@start\endgraf
\LT@err
{Longtable head or foot not at start of table}%
{Increase LTchunksize}%
\fi
\setbox#1\box\z@
\LT@get@widths
\LT@bchunk}
\def\endfirsthead{\LT@end@hd@ft\LT@firsthead}
\def\endhead{\LT@end@hd@ft\LT@head}
\def\endfoot{\LT@end@hd@ft\LT@foot}
\def\endlastfoot{\LT@end@hd@ft\LT@lastfoot}
\def\LT@startpbox#1{%
\bgroup
\let\@footnotetext\LT@p@ftntext
\setlength\hsize{#1}%
\@arrayparboxrestore
\vrule \@height \ht\@arstrutbox \@width \z@}
\def\LT@endpbox{%
\@finalstrut\@arstrutbox
\egroup
\the\LT@p@ftn
\global\LT@p@ftn{}%
\hfil}
\def\LT@p@ftntext#1{%
\edef\@tempa{\the\LT@p@ftn\noexpand\footnotetext[\the\c@footnote]}%
\global\LT@p@ftn\expandafter{\@tempa{#1}}}%
\@namedef{ver@longtable.sty}{2014/10/28 v4.11 Multi-page Table package (DPC) - frozen version for doxygen}
\endinput
%%
%% End of file `longtable.sty'.

View File

@@ -0,0 +1,184 @@
\let\mypdfximage\pdfximage\def\pdfximage{\immediate\mypdfximage}\documentclass[twoside]{book}
%% moved from doxygen.sty due to workaround for LaTex 2019 version and unmaintained tabu package
\usepackage{ifthen}
\ifx\requestedLaTeXdate\undefined
\usepackage{array}
\else
\usepackage{array}[=2016-10-06]
\fi
%%
% Packages required by doxygen
\usepackage{fixltx2e}
\usepackage{calc}
\usepackage{doxygen}
\usepackage{graphicx}
\usepackage[utf8]{inputenc}
\usepackage{makeidx}
\usepackage{multicol}
\usepackage{multirow}
\PassOptionsToPackage{warn}{textcomp}
\usepackage{textcomp}
\usepackage[nointegrals]{wasysym}
\usepackage[table]{xcolor}
\usepackage{ifpdf,ifxetex}
% Font selection
\usepackage[T1]{fontenc}
\usepackage[scaled=.90]{helvet}
\usepackage{courier}
\usepackage{amssymb}
\usepackage{sectsty}
\renewcommand{\familydefault}{\sfdefault}
\allsectionsfont{%
\fontseries{bc}\selectfont%
\color{darkgray}%
}
\renewcommand{\DoxyLabelFont}{%
\fontseries{bc}\selectfont%
\color{darkgray}%
}
\newcommand{\+}{\discretionary{\mbox{\scriptsize$\hookleftarrow$}}{}{}}
% Arguments of doxygenemoji:
% 1) ':<text>:' form of the emoji, already "LaTeX"-escaped
% 2) file with the name of the emoji without the .png extension
% in case image exist use this otherwise use the ':<text>:' form
\newcommand{\doxygenemoji}[2]{%
\IfFileExists{./#2.png}{\raisebox{-0.1em}{\includegraphics[height=0.9em]{./#2.png}}}{#1}%
}
% Page & text layout
\usepackage{geometry}
\geometry{%
a4paper,%
top=2.5cm,%
bottom=2.5cm,%
left=2.5cm,%
right=2.5cm%
}
\tolerance=750
\hfuzz=15pt
\hbadness=750
\setlength{\emergencystretch}{15pt}
\setlength{\parindent}{0cm}
\newcommand{\doxynormalparskip}{\setlength{\parskip}{3ex plus 2ex minus 2ex}}
\newcommand{\doxytocparskip}{\setlength{\parskip}{1ex plus 0ex minus 0ex}}
\doxynormalparskip
\makeatletter
\renewcommand{\paragraph}{%
\@startsection{paragraph}{4}{0ex}{-1.0ex}{1.0ex}{%
\normalfont\normalsize\bfseries\SS@parafont%
}%
}
\renewcommand{\subparagraph}{%
\@startsection{subparagraph}{5}{0ex}{-1.0ex}{1.0ex}{%
\normalfont\normalsize\bfseries\SS@subparafont%
}%
}
\makeatother
\makeatletter
\newcommand\hrulefilll{\leavevmode\leaders\hrule\hskip 0pt plus 1filll\kern\z@}
\makeatother
% Headers & footers
\usepackage{fancyhdr}
\pagestyle{fancyplain}
\fancyhead[LE]{\fancyplain{}{\bfseries\thepage}}
\fancyhead[CE]{\fancyplain{}{}}
\fancyhead[RE]{\fancyplain{}{\bfseries\leftmark}}
\fancyhead[LO]{\fancyplain{}{\bfseries\rightmark}}
\fancyhead[CO]{\fancyplain{}{}}
\fancyhead[RO]{\fancyplain{}{\bfseries\thepage}}
\fancyfoot[LE]{\fancyplain{}{}}
\fancyfoot[CE]{\fancyplain{}{}}
\fancyfoot[RE]{\fancyplain{}{\bfseries\scriptsize Generated by Doxygen }}
\fancyfoot[LO]{\fancyplain{}{\bfseries\scriptsize Generated by Doxygen }}
\fancyfoot[CO]{\fancyplain{}{}}
\fancyfoot[RO]{\fancyplain{}{}}
\renewcommand{\footrulewidth}{0.4pt}
\renewcommand{\chaptermark}[1]{%
\markboth{#1}{}%
}
\renewcommand{\sectionmark}[1]{%
\markright{\thesection\ #1}%
}
% Indices & bibliography
\usepackage{natbib}
\usepackage[titles]{tocloft}
\setcounter{tocdepth}{3}
\setcounter{secnumdepth}{5}
\makeindex
\usepackage{newunicodechar}
\newunicodechar{}{${}^{-}$}% Superscript minus
\newunicodechar{²}{${}^{2}$}% Superscript two
\newunicodechar{³}{${}^{3}$}% Superscript three
% Hyperlinks (required, but should be loaded last)
\ifpdf
\usepackage[pdftex,pagebackref=true]{hyperref}
\else
\ifxetex
\usepackage[pagebackref=true]{hyperref}
\else
\usepackage[ps2pdf,pagebackref=true]{hyperref}
\fi
\fi
\hypersetup{%
colorlinks=true,%
linkcolor=blue,%
citecolor=blue,%
unicode%
}
% Custom commands
\newcommand{\clearemptydoublepage}{%
\newpage{\pagestyle{empty}\cleardoublepage}%
}
\usepackage{caption}
\captionsetup{labelsep=space,justification=centering,font={bf},singlelinecheck=off,skip=4pt,position=top}
\usepackage{etoc}
\etocsettocstyle{\doxytocparskip}{\doxynormalparskip}
\renewcommand{\numberline}[1]{#1~}
%===== C O N T E N T S =====
\begin{document}
% Titlepage & ToC
\hypersetup{pageanchor=false,
bookmarksnumbered=true,
pdfencoding=unicode
}
\pagenumbering{alph}
\begin{titlepage}
\vspace*{7cm}
\begin{center}%
{\Large My Project }\\
\vspace*{1cm}
{\large Generated by Doxygen 1.8.17}\\
\end{center}
\end{titlepage}
\clearemptydoublepage
\pagenumbering{roman}
\tableofcontents
\clearemptydoublepage
\pagenumbering{arabic}
\hypersetup{pageanchor=true}
%--- Begin generated contents ---
%--- End generated contents ---
% Index
\backmatter
\newpage
\phantomsection
\clearemptydoublepage
\addcontentsline{toc}{chapter}{\indexname}
\printindex
\end{document}

File diff suppressed because it is too large Load Diff

37
lib/epdiy/doc/make.bat Normal file
View File

@@ -0,0 +1,37 @@
@ECHO OFF
pushd %~dp0
REM Command file for Sphinx documentation
if "%SPHINXBUILD%" == "" (
set SPHINXBUILD=sphinx-build
)
set SOURCEDIR=source
set BUILDDIR=build
if "%1" == "" goto help
%SPHINXBUILD% >NUL 2>NUL
if errorlevel 9009 (
echo.
echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
echo.installed, then set the SPHINXBUILD environment variable to point
echo.to the full path of the 'sphinx-build' executable. Alternatively you
echo.may add the Sphinx directory to PATH.
echo.
echo.If you don't have Sphinx installed, grab it from
echo.http://sphinx-doc.org/
exit /b 1
)
doxygen.exe
%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
goto end
:help
%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
:end
popd

View File

@@ -0,0 +1,3 @@
breathe>=4
Sphinx>=3
sphinx-rtd-theme>=0.5.2

View File

@@ -0,0 +1,44 @@
About
=====
EPDiy is a driver board for e-Paper (or E-ink) displays.
.. _display_types:
Display Types
-------------
The EPDiy driver board targets multiple E-Paper displays.
As the driving method for all matrix-based E-ink displays seems to be more or less the same, only the right connector and timings are needed.
A table of supported displays is mainained in the :code:`README.md` file.
Some of the supported displays are showcased below.
ED097OC4
~~~~~~~~
The ED097OC4 was the original target of this project. It is an 9.7 inch screen, with a resolution of 1200 * 825 pixels (150dpi).
It is fairly available on Ebay and AliExpress, for around 30$ to 35$.
There is also a lower contrast version (ED097OC1) which also works.
.. image:: img/ed097oc4.jpg
ED060SC4
~~~~~~~~
This is a 6 inch display, with a 800 * 600 resolution. With 150dpi as well, it has about half the total display area of the ED097OC4.
To connect this display, the 39-pin connector on the back has to be populated.
It is also the display a lot of experimentation was done with (see Thanks To), so there are alternative controllers available.
Besides the obvious difference in size, this display is cheaper (~20$) and also refreshes slightly faster than the ED097OC4.
.. image:: img/ed060sc4.jpg
ED097TC2
~~~~~~~~
Information on this display should be taken with a grain of salt. One of the displays I ordered as ED097OC4 came as ED097TC2,
and upon testing it also exhibited noticably better contrast and a more responsive electro-phoretic medium.
The ribbon connector looked like a ED097TC2 as well, or like the `9.7 inch screens offered by Waveshare <https://www.waveshare.com/9.7inch-e-Paper.htm>` (which is sold for a lot more).
If you are on the lookout for such a display keep in mind the authenticity of my sample is disputable and resolution and connector type should be double-checked.
.. image:: img/ed097tc2.jpg

View File

@@ -0,0 +1,20 @@
.. _pub_api:
Library API
===========
Highlevel API
-------------
.. doxygenfile:: epd_highlevel.h
Complete API
------------
.. doxygenfile:: epdiy.h
Internals
----------
.. doxygenfile:: epd_internals.h
Board-Specific Extensions
-------------------------
.. doxygenfile:: epd_board_specific.h

View File

@@ -0,0 +1,71 @@
# Configuration file for the Sphinx documentation builder.
#
# This file only contains a selection of the most common options. For a full
# list see the documentation:
# https://www.sphinx-doc.org/en/master/usage/configuration.html
# -- Path setup --------------------------------------------------------------
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
#
# import os
# import sys
# sys.path.insert(0, os.path.abspath('.'))
import subprocess, os
# -- Project information -----------------------------------------------------
project = 'EPDiy'
copyright = '2023, Valentin Roland'
author = 'Valentin Roland'
# The full version, including alpha/beta/rc tags
release = '2.0.0'
# -- General configuration ---------------------------------------------------
# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones.
extensions = [
'breathe'
]
# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']
# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
# This pattern also affects html_static_path and html_extra_path.
exclude_patterns = []
# -- Options for HTML output -------------------------------------------------
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
#
html_theme = 'sphinx_rtd_theme'
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ['_static']
breathe_projects = { "epdiy": "./xml/" }
breathe_default_project = "epdiy"
breathe_domain_by_extension = {
"h" : "c",
"c" : "c",
}
read_the_docs_build = os.environ.get('READTHEDOCS', None) == 'True'
if read_the_docs_build:
subprocess.call('cd ../; doxygen', shell=True)

View File

@@ -0,0 +1,95 @@
Fonts, Images, Waveforms
========================
The ESP32 is, although fairly capable, still a microcontroller.
Thus, with memory and computational resources limited, it is useful to do as much of the processing
for displaying fonts and images on a computer.
Epdiy comes with scripts that convert fonts, images and waveforms to C headers,
that you can then simply `#include` in your project.
Generating Font Files
---------------------
Fonts can only be used by the driver in a special header format
(inspired by the Adafruit GFX library), which need to be generated from TTF fonts.
For this purpose, the :code:`scripts/fontconvert.py` utility is provided.
.. code-block::
fontconvert.py [-h] [--compress] [--additional-intervals ADDITIONAL_INTERVALS] name size fontstack [fontstack ...]
The following example generates a header file for Fira Code at size 10, where glyphs that are not found in Fira Code will be taken from Symbola:
.. code-block::
./fontconvert.py FiraCode 10 /usr/share/fonts/TTF/FiraCode-Regular.ttf /usr/share/fonts/TTF/Symbola.ttf > ../examples/terminal/main/firacode.h
You can change which unicode character codes are to be exported by specifying additional
ranges of unicode code points with :code:`--additional-intervals`.
Intervals are written as :code:`min,max`.
To add multiple intervals, you can specify the :code:`--additional-intervals` option multiple times.
.. code-block::
./fontconvert.py ... --additional-intervals 0xE0A0,0xE0A2 --additional-intervals 0xE0B0,0xE0B3 ...
The above command would add two addtitional ranges.
You can enable compression with :code:`--compress`, which reduces the size of the generated font but comes at a performance cost.
If the generated font files with the default characters are too large for your application,
you can modify :code:`intervals` in :code:`fontconvert.py`.
Generating Images
-----------------
The process for converting images is very similar to converting fonts.
Run the :code:`scripts/imgconvert.py` script with an input image, an image name and an output image.
.. code-block::
imgconvert.py [-h] -i INPUTFILE -n NAME -o OUTPUTFILE [-maxw MAX_WIDTH] [-maxh MAX_HEIGHT]
The image is converted to grayscale scaled down to match fit into :code:`MAX_WIDTH` and :code:`MAX_HEIGHT` (1200x825 by default).
For accurate grayscale it is advisable to color-grade and scale the image with a dedicated tool before converting it.
:code:`OUTPUTFILE` will be a C header with the following constants defined:
- :code:`{NAME}_width` is the width of the image
- :code:`{NAME}_height` is the height of the image
- :code:`{NAME}_data` is the image data in 4 bit-per-pixel grayscale format.
Converting Waveforms
--------------------
.. note:: Waveform Timings and V7
Epdiy builtin waveforms currently use variable frame timings to reduce the number
of update cycles required. This is currently not implemented in V7. Hence, for best results it is recommended to use Vendor waveforms where available, which use constant frame timings.
In comercial applications, displays are driven with information in so-called `Waveform Files`.
These specify how which pulses to apply to the pixel to transition from one gray tone to another.
Unfortunately, they are display-specific and proprietary.
However, while they are not freely available, they can be obtained through a number of ways:
- Being a large customer of E-Ink. Unfortunately not doable for mere mortals.
- Finding them scattered around the internet. Examples include the `MobileRead forums <https://www.mobileread.com/>`_ or the `NXP Support forum <https://community.nxp.com/t5/i-MX-Processors/How-to-convert-wbf-waveform-file-to-wf-file/m-p/467926/highlight/true>`_.
- Extracting from e-Reader firmware.
- Extracting from a flash chip that comes with some displays. More on this can be found `here <https://hackaday.io/project/21168-fpga-eink-controller/log/57822-waveforms-binary-extract>`_.
Waveforms usually come with a :code:`*.wbf` file extension.
If you have a matching waveform file for your display, it can be converted to a waveform header that's usable by epdiy.
The advantage of using vendor waveforms include the availability of all implemented modes in the waveform file, support of a wide range of temperatures and more accurate grayscale-to-grayscale transitions.
As a first step, the waveform data is extracted from the original waveform file and stored in JSON format.
This can be done using a `modified version <https://github.com/vroland/inkwave>`_ of `inkwave <https://github.com/fread-ink/inkwave>`_ by Marc Juul.
Once a matching JSON file is obtained, the :code:`scripts/waveform_hdrgen.py` utility can be used to generate a waveform header, which can be included in your project.
::
waveform_hdrgen.py [-h] [--list-modes] [--temperature-range TEMPERATURE_RANGE] [--export-modes EXPORT_MODES] name
With the :code:`--list-modes` option, a list of all included modes is printed.
:code:`name` specifies a name for the generated :code:`EpdWaveform` object.
Additionally, the temperature range and modes to export can be limited in order to reduce file size.
An example for the usage of this script can be found in the top-level :code:`Makefile` of the epdiy repository.

View File

@@ -0,0 +1,140 @@
.. _getting_started:
Getting Started
===============
Getting your Board
------------------
At the current point in time, there is no official way to buy an epdiy board.
Fortunately, it is quite easy to order your own. There are many PCB prototype services
that will manufacture boards for a low price.
To use one of those services, upload the "Gerber files", usually provided as a zip file,
to the service.
You can find all the available hardware listed on the `Hardware Page <https://vroland.github.io/epdiy-hardware/>`_.
Choosing and Finding Parts
~~~~~~~~~~~~~~~~~~~~~~~~~~
The parts needed to assemble the epdiy board are listed in the `BOM.csv` file.
Commodity parts like resistors, capacitors, coils and diodes are interchangable, as long as they
fit the footprint.
When in doubt, use the parts listed in the BOM file.
However, some parts are not as common, especially the connectors.
Most of them can be found on sites like eBay or AliExpress.
Tips:
- Use the WROVER-B module instead of other WROVER variants.
This module exhibits a low deep sleep current and is proven to work.
- The LT1945 voltage booster seems to be out of stock with some distributors,
but they are available cheaply from AliExpress.
Calibrate VCOM
--------------
.. note:: Only for old boards
This is only needed with boards prior to revision 6.
From revision 6 onwards, VCOM can be set in software via :code:`epd_set_vcom(..)`.
EPaper displays use electrical fields to drive colored particles.
One of the required voltages, VCOM (Common Voltage) is display-dependent
and must be calibrated for each display individually.
Fortunately, the VCOM voltage is usually printed on the display, similar to this:
.. image:: img/vcom.jpg
The VCOM value is usually between -1V and -3V.
For the v6 board, you can enter the desired VCOM value in :code:`make menuconfig`.
No interaction is required.
For the older models, use the trimmer marked :code:`RV1`.
You can measure the VCOM on the VCOM test pad (if your board has one) or directly
at the amplifier:
.. image:: img/vcom_tp.jpg
.. image:: img/vcom_opamp.jpg
.. note::
Although most boards do not have it yet, image quality for partial updates can be improved by adding a (at least) 4.7uF capacitor between VCOM and GND.
When adding this capacitor, take care with the polarity as VCOM is negative!
Flashing the demo
-----------------
First, connect you board with the computer. In the output of :code:`lsusb` you should find something like:
::
Bus 001 Device 048: ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter
This means the serial adapter is working and there a serial like :code:`/dev/ttyUSB0` should appear.
Next, make sure you have the `Espressif IoT Development Framework <https://github.com/espressif/esp-idf>`_ installed.
The current stable (and tested) version is 5.3.
For instructions on how to get started with the IDF, please refer to their `documentation <https://docs.espressif.com/projects/esp-idf/en/stable/get-started/>`_.
Then, clone the :code:`epdiy` git repository (and its submodules):
::
git clone --recursive https://github.com/vroland/epdiy
Now, (after activating the IDF environment) you should be able to build the demo:
::
cd examples/demo/
idf.py build
Hold down the :code:`BOOT` button on your board, while quickly pressing the :code:`RESET` button.
The ESP module is now in boot mode.
Upload the demo program to the board with
::
idf.py flash -b 921600 && idf.py monitor
Pressing :code:`RESET` a second time should start the demo program, which will
output some information on the serial monitor.
With the **board power turned off**, connect your display.
Power on the board.
You should now see the demo output on your display.
Use with esp-idf
----------------
The neccessary functionality for driving an EPD display is encapsulated in the :code:`components/epdiy` IDF component.
To use it in you own project, simply copy the :code:`epdiy` folder to your project-local :code:`components` directory.
The component sould be automatically detected by the framework, you can now use
::
#include "epdiy.h"
to use the EPD driver's :ref:`pub_api`.
Selecting a Board and Display Type
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
With epdiy 2.0.0, the display type and board are set via :code:`epd_init()`.
Enable SPI RAM
~~~~~~~~~~~~~~~~~~~~~~~~
The ESP32-WROVER-B comes with an additional 8MB external PSRAM, where the :code:`epdiy` is going to store ~2MB for its internal frame buffers.
Since it is dynamically allocated from the heap, and the built-in SRAM of ~160KB is insufficient, we need to enable external SPI RAM first.
Open the :code:`menuconfig` again (see above) and navigate to :code:`Component config -> ESP32-Specific -> Support for external, SPI-connected RAM` and enable it.
Use with Arduino
----------------
Epdiy can be used as an Arduino library. Additionally, epdiy comes with board definitions for its supported boards, which must be installed separately.
To install epdiy to work with the Arduino IDE (>= 1.8), place the downloaded repository into your Arduino libraries folder.
Alternatively, it is possible to use the `Arduino APIs as an IDF component <https://github.com/espressif/arduino-esp32/blob/master/docs/esp-idf_component.md>`_,
which allows you to use the Arduino ecosystem (Except for a different build process).
This gives you full access to ESP-IDF options.

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 344 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 547 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

View File

@@ -0,0 +1,35 @@
.. EPDiy documentation master file, created by
sphinx-quickstart on Sat Apr 18 23:41:08 2020.
You can adapt this file completely to your liking, but it should at least
contain the root `toctree` directive.
The EPDiy Driver Board
======================
.. toctree::
:maxdepth: 2
:caption: Quickstart:
about.rst
getting_started.rst
filegen.rst
tips.rst
api.rst
EPDiy is a driver board which talks to affordable E-Paper (or E-Ink) screens, which are usually sold as replacement screens for E-Book readers. Why are they interesting?
* Easy on the eyes and paper-like aesthetics
* No power consumption when not updating
* Sunlight-readable
Ready-made DIY modules for this size and with 4bpp (16 Grayscale) color support are currently quite expensive. This project uses Kindle replacement screens, which are available for 20$ (small) / 30$ (large) on ebay!
The EPDiy driver board targets multiple E-Paper displays. As the driving method for all matrix-based E-ink displays seems to be more or less the same, only the right connector and timings are needed. The EPDiy PCB features a 33pin and a 39pin connector, which allow to drive the following display types: ED097OC4, ED060SC4, ED097TC2
:ref:`getting_started`
.. image:: img/demo.jpg
.. image:: img/board_p1.jpg
.. image:: img/board_p2.jpg

View File

@@ -0,0 +1,41 @@
Tips & Tricks
=============
Temperature Dependence
----------------------
The display refresh speed depends on the environmental temperature.
Thus, if your room temperature is significantly different from ~22°C, grayscale
accuracy might be affected when using the builtin waveform.
This can be mitigated by using a different timing curve, but this would require calibrating the display timings at that temperature.
If you did this for some temperature other than room temperature, please submit a pull request!
Deep Sleep Current
------------------
Board Revision V5 is optimized for running from a battery thanks to its low deep sleep current consumption.
In order to achieve the lowest possible deep sleep current, call
::
epd_deinit()
before going to deep sleep. This will de-initialize the I2S peripheral used to drive the diplay and bring the pins used by epdiy to a low-power state.
You should be able to achieve a deep-sleep current of less than 13µA.
If your deep-sleep current is much higher, please check your attached peripherals.
With some modules, you have to isolate GPIO 12 before going to deep sleep:
::
rtc_gpio_isolate(GPIO_NUM_12)
Adding a New Display
--------------------
This section is work-in-progress.
- Add display definitions in :code:`displays.c` and :code:`epd_display.h`.
- Include waveform in :code:`bulitin_waveforms.c`
- Calibrate timing curve in :code:`scripts/generate_epdiy_waveforms.py`.
- Add to the list of displays to build waveforms for in :code:`Makefile`
- Document

View File

@@ -0,0 +1,4 @@
cmake_minimum_required(VERSION 3.16.0)
set(EXTRA_COMPONENT_DIRS "../../")
include($ENV{IDF_PATH}/tools/cmake/project.cmake)
project(vcom_calibration_helper)

View File

@@ -0,0 +1,3 @@
set(app_sources "main.c")
idf_component_register(SRCS ${app_sources} REQUIRES epdiy)

View File

@@ -0,0 +1,42 @@
/*
* Simple helper program enabling EPD power to allow for easier VCOM calibration.
*
* This is only needed for boards V5 or lower!
**/
#include <stdio.h>
#include <string.h>
#include "esp_heap_caps.h"
#include "esp_log.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "sdkconfig.h"
#include "epdiy.h"
// choose the default demo board depending on the architecture
#ifdef CONFIG_IDF_TARGET_ESP32
#define DEMO_BOARD epd_board_v6
#elif defined(CONFIG_IDF_TARGET_ESP32S3)
#define DEMO_BOARD epd_board_v7
#endif
void enable_vcom() {
epd_init(&DEMO_BOARD, &ED097TC2, EPD_LUT_64K);
ESP_LOGI("main", "waiting for one second before poweron...");
vTaskDelay(1000);
ESP_LOGI("main", "enabling VCOMM...");
epd_poweron();
ESP_LOGI(
"main",
"VCOMM enabled. You can now adjust the on-board trimmer to the VCOM value specified on the "
"display."
);
while (1) {
vTaskDelay(1000);
};
}
void app_main() {
enable_vcom();
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,4 @@
cmake_minimum_required(VERSION 3.10.0)
set(EXTRA_COMPONENT_DIRS "../../")
include($ENV{IDF_PATH}/tools/cmake/project.cmake)
project(firmware)

View File

@@ -0,0 +1,21 @@
FONT_DIR ?= /usr/share/fonts/TTF
FONTCONVERT ?= ../../scripts/fontconvert.py
IMGCONVERT ?= ../../scripts/imgconvert.py
.PHONY: fonts
fonts: \
main/firasans_20.h \
main/firasans_12.h \
main/img_zebra.h \
main/img_board.h \
main/img_giraffe.h \
main/img_beach.h
main/firasans_%.h: $(FONTCONVERT)
python3 $(FONTCONVERT) --compress FiraSans_$* $* $(FONT_DIR)/FiraSans-Regular.ttf $(FONT_DIR)/Symbola.ttf > $@
main/img_%.h: files/%.jpg
python3 $(IMGCONVERT) -i $< -o $@ -n img_$*
clean:
rm main/*.h

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 142 KiB

View File

@@ -0,0 +1,4 @@
set(app_sources "main.c")
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
idf_component_register(SRCS ${app_sources} REQUIRES epdiy)

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,271 @@
/* Simple firmware for a ESP32 displaying a static image on an EPaper Screen.
*
* Write an image into a header file using a 3...2...1...0 format per pixel,
* for 4 bits color (16 colors - well, greys.) MSB first. At 80 MHz, screen
* clears execute in 1.075 seconds and images are drawn in 1.531 seconds.
*/
#include <esp_heap_caps.h>
#include <esp_log.h>
#include <esp_sleep.h>
#include <esp_timer.h>
#include <esp_types.h>
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#include <inttypes.h>
#include <stdio.h>
#include <string.h>
#include <epdiy.h>
#include "sdkconfig.h"
#include "firasans_12.h"
#include "firasans_20.h"
#include "img_beach.h"
#include "img_board.h"
#include "img_zebra.h"
#define WAVEFORM EPD_BUILTIN_WAVEFORM
// choose the default demo board depending on the architecture
#ifdef CONFIG_IDF_TARGET_ESP32
#define DEMO_BOARD epd_board_v6
#elif defined(CONFIG_IDF_TARGET_ESP32S3)
#define DEMO_BOARD epd_board_v7
#endif
EpdiyHighlevelState hl;
void idf_setup() {
epd_init(&DEMO_BOARD, &ED097TC2, EPD_LUT_64K);
// Set VCOM for boards that allow to set this in software (in mV).
// This will print an error if unsupported. In this case,
// set VCOM using the hardware potentiometer and delete this line.
epd_set_vcom(1560);
hl = epd_hl_init(WAVEFORM);
// Default orientation is EPD_ROT_LANDSCAPE
epd_set_rotation(EPD_ROT_LANDSCAPE);
printf(
"Dimensions after rotation, width: %d height: %d\n\n",
epd_rotated_display_width(),
epd_rotated_display_height()
);
// The display bus settings for V7 may be conservative, you can manually
// override the bus speed to tune for speed, i.e., if you set the PSRAM speed
// to 120MHz.
// epd_set_lcd_pixel_clock_MHz(17);
heap_caps_print_heap_info(MALLOC_CAP_INTERNAL);
heap_caps_print_heap_info(MALLOC_CAP_SPIRAM);
}
#ifndef ARDUINO_ARCH_ESP32
void delay(uint32_t millis) {
vTaskDelay(millis / portTICK_PERIOD_MS);
}
#endif
static inline void checkError(enum EpdDrawError err) {
if (err != EPD_DRAW_SUCCESS) {
ESP_LOGE("demo", "draw error: %X", err);
}
}
void draw_progress_bar(int x, int y, int width, int percent, uint8_t* fb) {
const uint8_t white = 0xFF;
const uint8_t black = 0x0;
EpdRect border = {
.x = x,
.y = y,
.width = width,
.height = 20,
};
epd_fill_rect(border, white, fb);
epd_draw_rect(border, black, fb);
EpdRect bar = {
.x = x + 5,
.y = y + 5,
.width = (width - 10) * percent / 100,
.height = 10,
};
epd_fill_rect(bar, black, fb);
checkError(epd_hl_update_area(&hl, MODE_DU, epd_ambient_temperature(), border));
}
void idf_loop() {
// select the font based on display width
const EpdFont* font;
if (epd_width() < 1000) {
font = &FiraSans_12;
} else {
font = &FiraSans_20;
}
uint8_t* fb = epd_hl_get_framebuffer(&hl);
epd_poweron();
epd_clear();
int temperature = epd_ambient_temperature();
epd_poweroff();
printf("current temperature: %d\n", temperature);
epd_fill_circle(30, 30, 15, 0, fb);
int cursor_x = epd_rotated_display_width() / 2;
int cursor_y = epd_rotated_display_height() / 2 - 100;
EpdFontProperties font_props = epd_font_properties_default();
font_props.flags = EPD_DRAW_ALIGN_CENTER;
char srotation[32];
sprintf(srotation, "Loading demo...\nRotation: %d", epd_get_rotation());
epd_write_string(font, srotation, &cursor_x, &cursor_y, fb, &font_props);
int bar_x = epd_rotated_display_width() / 2 - 200;
int bar_y = epd_rotated_display_height() / 2;
epd_poweron();
checkError(epd_hl_update_screen(&hl, MODE_GL16, temperature));
epd_poweroff();
for (int i = 0; i < 6; i++) {
epd_poweron();
draw_progress_bar(bar_x, bar_y, 400, i * 10, fb);
epd_poweroff();
}
cursor_x = epd_rotated_display_width() / 2;
cursor_y = epd_rotated_display_height() / 2 + 100;
epd_write_string(
font, "Just kidding,\n this is a demo animation 😉", &cursor_x, &cursor_y, fb, &font_props
);
epd_poweron();
checkError(epd_hl_update_screen(&hl, MODE_GL16, temperature));
epd_poweroff();
for (int i = 0; i < 6; i++) {
epd_poweron();
draw_progress_bar(bar_x, bar_y, 400, 50 - i * 10, fb);
epd_poweroff();
vTaskDelay(1);
}
cursor_y = epd_rotated_display_height() / 2 + 200;
cursor_x = epd_rotated_display_width() / 2;
EpdRect clear_area = {
.x = 0,
.y = epd_rotated_display_height() / 2 + 100,
.width = epd_rotated_display_width(),
.height = 300,
};
epd_fill_rect(clear_area, 0xFF, fb);
epd_write_string(
font, "Now let's look at some pictures.", &cursor_x, &cursor_y, fb, &font_props
);
epd_poweron();
checkError(epd_hl_update_screen(&hl, MODE_GL16, temperature));
epd_poweroff();
delay(1000);
epd_hl_set_all_white(&hl);
EpdRect zebra_area = {
.x = epd_rotated_display_width() / 2 - img_zebra_width / 2,
.y = epd_rotated_display_height() / 2 - img_zebra_height / 2,
.width = img_zebra_width,
.height = img_zebra_height,
};
epd_draw_rotated_image(zebra_area, img_zebra_data, fb);
epd_poweron();
checkError(epd_hl_update_screen(&hl, MODE_GC16, temperature));
epd_poweroff();
delay(5000);
EpdRect board_area = {
.x = epd_rotated_display_width() / 2 - img_board_width / 2,
.y = epd_rotated_display_height() / 2 - img_board_height / 2,
.width = img_board_width,
.height = img_board_height,
};
epd_draw_rotated_image(board_area, img_board_data, fb);
cursor_x = epd_rotated_display_width() / 2;
cursor_y = board_area.y;
font_props.flags |= EPD_DRAW_BACKGROUND;
epd_write_string(font, "↓ Thats the V2 board. ↓", &cursor_x, &cursor_y, fb, &font_props);
epd_poweron();
checkError(epd_hl_update_screen(&hl, MODE_GC16, temperature));
epd_poweroff();
delay(5000);
epd_hl_set_all_white(&hl);
EpdRect border_rect = {
.x = 20,
.y = 20,
.width = epd_rotated_display_width() - 40,
.height = epd_rotated_display_height() - 40,
};
epd_draw_rect(border_rect, 0, fb);
cursor_x = 50;
cursor_y = 100;
epd_write_default(
font,
"➸ 16 color grayscale\n"
"➸ ~250ms - 1700ms for full frame draw 🚀\n"
"➸ Use with 6\" or 9.7\" EPDs\n"
"➸ High-quality font rendering ✎🙋\n"
"➸ Partial update\n"
"➸ Arbitrary transitions with vendor waveforms",
&cursor_x,
&cursor_y,
fb
);
EpdRect img_beach_area = {
.x = 0,
.y = epd_rotated_display_height() - img_beach_height,
.width = img_beach_width,
.height = img_beach_height,
};
epd_draw_rotated_image(img_beach_area, img_beach_data, fb);
epd_poweron();
checkError(epd_hl_update_screen(&hl, MODE_GC16, temperature));
epd_poweroff();
printf("going to sleep...\n");
epd_deinit();
esp_deep_sleep_start();
}
#ifndef ARDUINO_ARCH_ESP32
void app_main() {
idf_setup();
while (1) {
idf_loop();
};
}
#endif

View File

@@ -0,0 +1,30 @@
/**
* This is the Arduino wrapper for the "Demo" example.
* Please go to the main.c for the main example file.
*
* This example was developed for the ESP IoT Development Framework (IDF).
* You can still use this code in the Arduino IDE, but it may not look
* and feel like a classic Arduino sketch.
* If you are looking for an example with Arduino look-and-feel,
* please check the other examples.
*/
// Important: These are C functions, so they must be declared with C linkage!
extern "C" {
void idf_setup();
void idf_loop();
}
void setup() {
if (psramInit()) {
Serial.println("\nThe PSRAM is correctly initialized");
} else {
Serial.println("\nPSRAM does not work");
}
idf_setup();
}
void loop() {
idf_loop();
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,4 @@
cmake_minimum_required(VERSION 3.16.0)
set(EXTRA_COMPONENT_DIRS "../../")
include($ENV{IDF_PATH}/tools/cmake/project.cmake)
project(dragon_example)

View File

@@ -0,0 +1,7 @@
A demo showing a Full-Screen Image
==================================
*The image size is chosen to fit a 1200 * 825 display!*
Image by David REVOY / CC BY (https://creativecommons.org/licenses/by/3.0)
https://commons.wikimedia.org/wiki/File:Durian_-_Sintel-wallpaper-dragon.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 212 KiB

View File

@@ -0,0 +1,3 @@
set(app_sources "main.c")
idf_component_register(SRCS ${app_sources} REQUIRES epdiy)

Some files were not shown because too many files have changed in this diff Show More