From 30624bfbbddd8a905c51225f4ec5db35e7b2843f Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 Date: Tue, 19 May 2020 11:41:35 +0200 Subject: [PATCH] Committed existing project --- .gitignore | 2 + .gitmodules | 2 +- .travis.yml | 67 + bobbycar-protocol | 1 - bobbycar.csv | 6 + icons/back.png | Bin 0 -> 9724 bytes icons/bluetooth.png | Bin 0 -> 11114 bytes icons/buzzer.png | Bin 0 -> 9125 bytes icons/checked.png | Bin 0 -> 10088 bytes icons/demos.png | Bin 0 -> 1847 bytes icons/graph.png | Bin 0 -> 1683 bytes icons/info.png | Bin 0 -> 10407 bytes icons/lock.png | Bin 0 -> 1472 bytes icons/logo.png | Bin 0 -> 25068 bytes icons/modes.png | Bin 0 -> 2217 bytes icons/poweroff.png | Bin 0 -> 10541 bytes icons/presets.png | Bin 0 -> 2096 bytes icons/reboot.png | Bin 0 -> 1757 bytes icons/scan.png | Bin 0 -> 13821 bytes icons/settings.png | Bin 0 -> 1836 bytes icons/unchecked.png | Bin 0 -> 7277 bytes icons/wifi.png | Bin 0 -> 11628 bytes include/README | 39 + platformio.ini | 160 ++ src/accessorinterface.h | 21 + src/actioninterface.h | 11 + src/actions/bluetoothbeginaction.h | 21 + src/actions/bluetoothbeginmasteraction.h | 21 + src/actions/bluetoothconnectbmsaction.h | 22 + src/actions/bluetoothdisconnectaction.h | 21 + src/actions/bluetoothendaction.h | 15 + src/actions/bluetoothflushaction.h | 15 + src/actions/bmsturnoffchargeaction.h | 19 + src/actions/bmsturnoffdischargeaction.h | 19 + src/actions/bmsturnonchargeaction.h | 19 + src/actions/bmsturnondischargeaction.h | 19 + src/actions/dummyaction.h | 11 + src/actions/loadsettingsaction.h | 12 + src/actions/multiaction.h | 35 + src/actions/rebootaction.h | 28 + src/actions/savesettingsaction.h | 12 + src/actions/switchscreenaction.h | 13 + src/actions/toggleboolaction.h | 15 + src/actions/updateswapfrontbackaction.h | 12 + src/actions/wifidisconnectaction.h | 21 + src/actions/wifienableipv6action.h | 21 + src/actions/wifireconnectaction.h | 21 + src/actions/wifisoftapenableipv6action.h | 21 + src/bluetoothtexthelpers.h | 37 + src/bmsutils.h | 122 + src/bobbycar-protocol/protocol.h | 122 + src/changevaluedisplay.h | 150 ++ src/changevaluedisplay_bool.h | 52 + src/changevaluedisplay_controlmode.h | 64 + src/changevaluedisplay_controltype.h | 60 + src/changevaluedisplay_larsmmode_mode.h | 65 + src/changevaluedisplay_wifi_mode_t.h | 66 + src/changevaluedisplay_wifi_power_t.h | 98 + src/checkboxicon.h | 17 + src/colorinterface.h | 32 + src/controller.h | 28 + src/debugcolorhelpers.h | 15 + src/debugtexthelpers.h | 90 + src/demodisplay.h | 17 + src/display.h | 30 + src/displays/bmsdisplay.h | 89 + src/displays/calibratedisplay.h | 107 + src/displays/dualgraphdisplay.h | 51 + src/displays/gameoflifedisplay.h | 188 ++ src/displays/graphdisplay.h | 70 + src/displays/lockscreen.h | 163 ++ src/displays/matrixdisplay.h | 94 + src/displays/menus/aboutmenu.h | 48 + .../menus/accesspointwifisettingsmenu.h | 66 + src/displays/menus/bluetoothsettingsmenu.h | 39 + src/displays/menus/bmsmenu.h | 38 + src/displays/menus/buzzermenu.h | 55 + src/displays/menus/commanddebugmenu.h | 33 + src/displays/menus/debugmenu.h | 63 + src/displays/menus/defaultmodesettingsmenu.h | 50 + src/displays/menus/demosmenu.h | 33 + src/displays/menus/dynamicdebugmenu.h | 153 ++ src/displays/menus/enablemenu.h | 30 + src/displays/menus/feedbackdebugmenu.h | 34 + src/displays/menus/genericwifisettingsmenu.h | 79 + src/displays/menus/graphsmenu.h | 69 + src/displays/menus/hardwaresettingsmenu.h | 44 + src/displays/menus/invertmenu.h | 30 + src/displays/menus/larsmmodesettingsmenu.h | 31 + src/displays/menus/limitssettingsmenu.h | 39 + src/displays/menus/mainmenu.h | 51 + src/displays/menus/modessettingsmenu.h | 28 + src/displays/menus/motorfeedbackdebugmenu.h | 40 + src/displays/menus/motorstatedebugmenu.h | 40 + src/displays/menus/potisettingsmenu.h | 50 + src/displays/menus/presetsmenu.h | 48 + src/displays/menus/selectmodemenu.h | 63 + src/displays/menus/settingsmenu.h | 53 + src/displays/menus/stationwifisettingsmenu.h | 140 ++ src/displays/menus/tempomatmodesettingsmenu.h | 31 + src/displays/menus/wifiscanmenu.h | 109 + src/displays/menus/wifisettingsmenu.h | 31 + src/displays/metersdisplay.h | 281 +++ src/displays/pingpongdisplay.h | 236 ++ src/displays/poweroffdisplay.h | 62 + src/displays/spirodisplay.h | 136 ++ src/displays/starfielddisplay.h | 111 + src/displays/statusdisplay.h | 255 +++ src/displays/updatedisplay.h | 93 + src/dpad.h | 82 + src/esptexthelpers.h | 64 + src/feedbackparser.h | 86 + src/fontinterface.h | 29 + src/globals.h | 79 + src/htmltag.h | 46 + src/htmlutils.h | 91 + src/icon.h | 14 + src/iconinterface.h | 19 + src/icons/alert.h | 42 + src/icons/back.h | 46 + src/icons/bluetooth.h | 46 + src/icons/bms.h | 46 + src/icons/buzzer.h | 46 + src/icons/checked.h | 46 + src/icons/close.h | 42 + src/icons/demos.h | 46 + src/icons/graph.h | 46 + src/icons/hardware.h | 46 + src/icons/info.h | 46 + src/icons/lock.h | 46 + src/icons/logo.h | 1960 +++++++++++++++++ src/icons/modes.h | 46 + src/icons/poweroff.h | 46 + src/icons/presets.h | 46 + src/icons/reboot.h | 46 + src/icons/scan.h | 46 + src/icons/settings.h | 46 + src/icons/unchecked.h | 46 + src/icons/wifi.h | 46 + src/main.cpp | 154 ++ src/menudefinitioninterface.h | 13 + src/menudisplay.h | 255 +++ src/menuitem.h | 29 + src/modeinterface.h | 16 + src/modes/defaultmode.h | 90 + src/modes/ignoreinputmode.h | 41 + src/modes/larsmmode.h | 110 + src/modes/tempomatmode.h | 57 + src/ota.h | 45 + src/presets.h | 84 + src/rotary.h | 85 + src/screens.h | 380 ++++ src/serialhandler.h | 92 + src/settings.h | 122 + src/settingsaccessors.h | 78 + src/settingssaver.h | 150 ++ src/staticmenudefinition.h | 37 + src/statistics.h | 68 + src/textinterface.h | 67 + src/texts.h | 296 +++ src/utils.h | 335 +++ src/widgets/graph.h | 144 ++ src/widgets/label.h | 78 + src/widgets/progressbar.h | 46 + test/README | 11 + 165 files changed, 11604 insertions(+), 2 deletions(-) create mode 100644 .gitignore create mode 100644 .travis.yml delete mode 160000 bobbycar-protocol create mode 100644 bobbycar.csv create mode 100644 icons/back.png create mode 100644 icons/bluetooth.png create mode 100644 icons/buzzer.png create mode 100644 icons/checked.png create mode 100644 icons/demos.png create mode 100644 icons/graph.png create mode 100644 icons/info.png create mode 100644 icons/lock.png create mode 100644 icons/logo.png create mode 100644 icons/modes.png create mode 100644 icons/poweroff.png create mode 100644 icons/presets.png create mode 100644 icons/reboot.png create mode 100644 icons/scan.png create mode 100644 icons/settings.png create mode 100644 icons/unchecked.png create mode 100644 icons/wifi.png create mode 100644 include/README create mode 100644 platformio.ini create mode 100644 src/accessorinterface.h create mode 100644 src/actioninterface.h create mode 100644 src/actions/bluetoothbeginaction.h create mode 100644 src/actions/bluetoothbeginmasteraction.h create mode 100644 src/actions/bluetoothconnectbmsaction.h create mode 100644 src/actions/bluetoothdisconnectaction.h create mode 100644 src/actions/bluetoothendaction.h create mode 100644 src/actions/bluetoothflushaction.h create mode 100644 src/actions/bmsturnoffchargeaction.h create mode 100644 src/actions/bmsturnoffdischargeaction.h create mode 100644 src/actions/bmsturnonchargeaction.h create mode 100644 src/actions/bmsturnondischargeaction.h create mode 100644 src/actions/dummyaction.h create mode 100644 src/actions/loadsettingsaction.h create mode 100644 src/actions/multiaction.h create mode 100644 src/actions/rebootaction.h create mode 100644 src/actions/savesettingsaction.h create mode 100644 src/actions/switchscreenaction.h create mode 100644 src/actions/toggleboolaction.h create mode 100644 src/actions/updateswapfrontbackaction.h create mode 100644 src/actions/wifidisconnectaction.h create mode 100644 src/actions/wifienableipv6action.h create mode 100644 src/actions/wifireconnectaction.h create mode 100644 src/actions/wifisoftapenableipv6action.h create mode 100644 src/bluetoothtexthelpers.h create mode 100644 src/bmsutils.h create mode 100644 src/bobbycar-protocol/protocol.h create mode 100644 src/changevaluedisplay.h create mode 100644 src/changevaluedisplay_bool.h create mode 100644 src/changevaluedisplay_controlmode.h create mode 100644 src/changevaluedisplay_controltype.h create mode 100644 src/changevaluedisplay_larsmmode_mode.h create mode 100644 src/changevaluedisplay_wifi_mode_t.h create mode 100644 src/changevaluedisplay_wifi_power_t.h create mode 100644 src/checkboxicon.h create mode 100644 src/colorinterface.h create mode 100644 src/controller.h create mode 100644 src/debugcolorhelpers.h create mode 100644 src/debugtexthelpers.h create mode 100644 src/demodisplay.h create mode 100644 src/display.h create mode 100644 src/displays/bmsdisplay.h create mode 100644 src/displays/calibratedisplay.h create mode 100644 src/displays/dualgraphdisplay.h create mode 100644 src/displays/gameoflifedisplay.h create mode 100644 src/displays/graphdisplay.h create mode 100644 src/displays/lockscreen.h create mode 100644 src/displays/matrixdisplay.h create mode 100644 src/displays/menus/aboutmenu.h create mode 100644 src/displays/menus/accesspointwifisettingsmenu.h create mode 100644 src/displays/menus/bluetoothsettingsmenu.h create mode 100644 src/displays/menus/bmsmenu.h create mode 100644 src/displays/menus/buzzermenu.h create mode 100644 src/displays/menus/commanddebugmenu.h create mode 100644 src/displays/menus/debugmenu.h create mode 100644 src/displays/menus/defaultmodesettingsmenu.h create mode 100644 src/displays/menus/demosmenu.h create mode 100644 src/displays/menus/dynamicdebugmenu.h create mode 100644 src/displays/menus/enablemenu.h create mode 100644 src/displays/menus/feedbackdebugmenu.h create mode 100644 src/displays/menus/genericwifisettingsmenu.h create mode 100644 src/displays/menus/graphsmenu.h create mode 100644 src/displays/menus/hardwaresettingsmenu.h create mode 100644 src/displays/menus/invertmenu.h create mode 100644 src/displays/menus/larsmmodesettingsmenu.h create mode 100644 src/displays/menus/limitssettingsmenu.h create mode 100644 src/displays/menus/mainmenu.h create mode 100644 src/displays/menus/modessettingsmenu.h create mode 100644 src/displays/menus/motorfeedbackdebugmenu.h create mode 100644 src/displays/menus/motorstatedebugmenu.h create mode 100644 src/displays/menus/potisettingsmenu.h create mode 100644 src/displays/menus/presetsmenu.h create mode 100644 src/displays/menus/selectmodemenu.h create mode 100644 src/displays/menus/settingsmenu.h create mode 100644 src/displays/menus/stationwifisettingsmenu.h create mode 100644 src/displays/menus/tempomatmodesettingsmenu.h create mode 100644 src/displays/menus/wifiscanmenu.h create mode 100644 src/displays/menus/wifisettingsmenu.h create mode 100644 src/displays/metersdisplay.h create mode 100644 src/displays/pingpongdisplay.h create mode 100644 src/displays/poweroffdisplay.h create mode 100644 src/displays/spirodisplay.h create mode 100644 src/displays/starfielddisplay.h create mode 100644 src/displays/statusdisplay.h create mode 100644 src/displays/updatedisplay.h create mode 100644 src/dpad.h create mode 100644 src/esptexthelpers.h create mode 100644 src/feedbackparser.h create mode 100644 src/fontinterface.h create mode 100644 src/globals.h create mode 100644 src/htmltag.h create mode 100644 src/htmlutils.h create mode 100644 src/icon.h create mode 100644 src/iconinterface.h create mode 100644 src/icons/alert.h create mode 100644 src/icons/back.h create mode 100644 src/icons/bluetooth.h create mode 100644 src/icons/bms.h create mode 100644 src/icons/buzzer.h create mode 100644 src/icons/checked.h create mode 100644 src/icons/close.h create mode 100644 src/icons/demos.h create mode 100644 src/icons/graph.h create mode 100644 src/icons/hardware.h create mode 100644 src/icons/info.h create mode 100644 src/icons/lock.h create mode 100644 src/icons/logo.h create mode 100644 src/icons/modes.h create mode 100644 src/icons/poweroff.h create mode 100644 src/icons/presets.h create mode 100644 src/icons/reboot.h create mode 100644 src/icons/scan.h create mode 100644 src/icons/settings.h create mode 100644 src/icons/unchecked.h create mode 100644 src/icons/wifi.h create mode 100644 src/main.cpp create mode 100644 src/menudefinitioninterface.h create mode 100644 src/menudisplay.h create mode 100644 src/menuitem.h create mode 100644 src/modeinterface.h create mode 100644 src/modes/defaultmode.h create mode 100644 src/modes/ignoreinputmode.h create mode 100644 src/modes/larsmmode.h create mode 100644 src/modes/tempomatmode.h create mode 100644 src/ota.h create mode 100644 src/presets.h create mode 100644 src/rotary.h create mode 100644 src/screens.h create mode 100644 src/serialhandler.h create mode 100644 src/settings.h create mode 100644 src/settingsaccessors.h create mode 100644 src/settingssaver.h create mode 100644 src/staticmenudefinition.h create mode 100644 src/statistics.h create mode 100644 src/textinterface.h create mode 100644 src/texts.h create mode 100644 src/utils.h create mode 100644 src/widgets/graph.h create mode 100644 src/widgets/label.h create mode 100644 src/widgets/progressbar.h create mode 100644 test/README diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..07c18dc --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.pio +platformio.pro* diff --git a/.gitmodules b/.gitmodules index 21054fd..f85e50d 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ [submodule "bobbycar-protocol"] - path = bobbycar-protocol + path = src/bobbycar-protocol url = git@github.com:bobbycar-graz/bobbycar-protocol.git diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..7c486f1 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,67 @@ +# Continuous Integration (CI) is the practice, in software +# engineering, of merging all developer working copies with a shared mainline +# several times a day < https://docs.platformio.org/page/ci/index.html > +# +# Documentation: +# +# * Travis CI Embedded Builds with PlatformIO +# < https://docs.travis-ci.com/user/integration/platformio/ > +# +# * PlatformIO integration with Travis CI +# < https://docs.platformio.org/page/ci/travis.html > +# +# * User Guide for `platformio ci` command +# < https://docs.platformio.org/page/userguide/cmd_ci.html > +# +# +# Please choose one of the following templates (proposed below) and uncomment +# it (remove "# " before each line) or use own configuration according to the +# Travis CI documentation (see above). +# + + +# +# Template #1: General project. Test it using existing `platformio.ini`. +# + +# language: python +# python: +# - "2.7" +# +# sudo: false +# cache: +# directories: +# - "~/.platformio" +# +# install: +# - pip install -U platformio +# - platformio update +# +# script: +# - platformio run + + +# +# Template #2: The project is intended to be used as a library with examples. +# + +# language: python +# python: +# - "2.7" +# +# sudo: false +# cache: +# directories: +# - "~/.platformio" +# +# env: +# - PLATFORMIO_CI_SRC=path/to/test/file.c +# - PLATFORMIO_CI_SRC=examples/file.ino +# - PLATFORMIO_CI_SRC=path/to/test/directory +# +# install: +# - pip install -U platformio +# - platformio update +# +# script: +# - platformio ci --lib="." --board=ID_1 --board=ID_2 --board=ID_N diff --git a/bobbycar-protocol b/bobbycar-protocol deleted file mode 160000 index 39f76cb..0000000 --- a/bobbycar-protocol +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 39f76cb62b32da2ea8d7a7154e1b2854dbf792ab diff --git a/bobbycar.csv b/bobbycar.csv new file mode 100644 index 0000000..dc6ef99 --- /dev/null +++ b/bobbycar.csv @@ -0,0 +1,6 @@ +# Name, Type, SubType, Offset, Size, Flags +nvs, data, nvs, 0x9000, 0x5000, +otadata, data, ota, 0xe000, 0x2000, +app0, app, ota_0, 0x10000, 0x250000, +app1, app, ota_1, 0x260000, 0x250000, +spiffs, data, spiffs, 0x520000, 0x250000, diff --git a/icons/back.png b/icons/back.png new file mode 100644 index 0000000000000000000000000000000000000000..c19f8d85307dfc83494c178bb85ef77ea4c5821d GIT binary patch literal 9724 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 Dv7}NK literal 0 HcmV?d00001 diff --git a/icons/buzzer.png b/icons/buzzer.png new file mode 100644 index 0000000000000000000000000000000000000000..b002f304cd9166ea4361e489669bb731da6b67a5 GIT binary patch literal 9125 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 literal 0 HcmV?d00001 diff --git a/icons/graph.png b/icons/graph.png new file mode 100644 index 0000000000000000000000000000000000000000..e62974f57628ab0839d0b243cd35a6da71b30c17 GIT binary patch literal 1683 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 Y^0o2Ij-RZs0aQzPy85}Sb4q9e0N$v_I{*Lx literal 0 HcmV?d00001 diff --git a/icons/lock.png b/icons/lock.png new file mode 100644 index 0000000000000000000000000000000000000000..5d7008bf0e6776f05337d1ee4b3ee976cf69fb39 GIT binary patch literal 1472 zcmeAS@N?(olHy`uVBq!ia0y~yV2}V|4mJh`h6m-gKNuJo*pj^6T^PXNr}OT51_lPs z0*}aI1_tIb5N52s+H?jaSXSVe4$=$86+TOsF)%RC^>lFz@i;y;)HfqJROH{ey_Ncv zwUwsFE-77N)D6D%Dn~?enKW~r*Il2N$9lacMvA0a=WXFy=fZwREG=1awUP+S(%F}O zxKF*wq0CxnEOa~b)%iWkGT)v3z4Q3dYTqW`S!WtQSInt?_x*11zUmz<-aRun?%mt# zw)o=|fk&raym(xP`fkhaA3Ar=Z_fj~_qe8s=+Fn@CjQtK^eSre%{7cW z_HNz!b>@^$j&}3w1J;JU*IJsVy_B!^e!VBh$8+!A<>h7Y=G-ouQ5mP{>L@U!`)E>X zaq(tdHRI&k+P~3jOCz)Y#tE>P>zpoPc(G8cK*pU(BHU|X-1=}aaq-3PW;?k=L_~Bv zviKLL*=o_Je#!RmRu3=D9>bj)T>{59-n)N)|Ab(@=@ZYUg-W!k^*x@GdpjwkX3RFn_^`rPt^E&iHu#R_JxJo(*+B)-ieQ z<;#$*`Ra77dKy(R$z$Rg=9+!Q8&2%)v6NiL(#BXI zg$7OX(S9+f?u6s-`tEa%y$j7aC%jNx;r!`{XuC_x!0acf`8y(oE>?(42D^n@S$T(r^{@L~sJ0AqEJHF|s{*#lO zE_?YFigrk*q%xdl+GKVk)F6)KanNa#6@v0|bKfy;U_8RWbF18t@jSx`rOM^0zwW;+ zd*#8{bR{}gZuvUK7KTUv8FrY=cse<0(P0J#2GtVRh?3-@)Wnih-IT-D+7ae{we)14Iq_P5M2yL28IT@21dF@1|deqRz_x4hNch= zY}PT2C>nC}Q!>*kp&ATz4GlvKEI}GfjUXB}%URViFfgQpoaB?4oSIjh%8*e~QedU8 z54J0_EHyblH#a}8STDaQT|Wn+q*yr)78&qol`;+0NAxxwEzGB literal 0 HcmV?d00001 diff --git a/icons/logo.png b/icons/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..e5918404676e7d1ac370af0b23573a5e81a7ca86 GIT binary patch literal 25068 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 II;Vst07hZ1-2eap literal 0 HcmV?d00001 diff --git a/icons/modes.png b/icons/modes.png new file mode 100644 index 0000000000000000000000000000000000000000..385c2141689eff4d4674605758008b5c2935b4a7 GIT binary patch literal 2217 zcmeAS@N?(olHy`uVBq!ia0y~yV2}V|4mJh`h6m-gKNuJoSkfJR9T^zbpD<_bdda}R zz?S6g?!o{DKb?2iGcYi47I;J!GcYiCfU(=jY&(!(S%G6Z$Sg3f@L9Tyfq`wIr;B5V z$MMpuo;lLbC69gluQNxneaQ~*B`%)Jay++fjVQ`d-GpvW|Nno{Zu9%Ey5+CC*B>q2V`uZ_sK5N3J(hPS_pHv;U2x5E-RpHzS7mR$ zdFsxQx9xiI`+xlNl=*!o`TorFbAKESU-;#i?W_X*e>MefpW63t*j^t0+Fb6h&+`i( z-bEx8dnt>E1lS0z(+)Ju)>$7Nvp4wRd*z!;gWtzl+SdJh;(hGU#LXAd4?q3id8z$J z;(}$%ZqNVm>EPj7``T|i-!}KZ|NJ{z=s|F7ilEH#V;j68$~f0Ack(`znw@STkemH> zRmaK3N%P{g_4k{x`MphMJkQKsRD68-Jh?wX*SY7{?y|dlHD*zon8xf-o#V$!W3Tm^ zeyZx*6uB%XY(+$>%@hweUk{DKyPfYZg+I2eefq{UAZLR)lgdZQMV)63tXpnX_wPaS z)@$dEXf0A+P@&XP^OfbQm5J-(h*|q^AHwtTRj;B50pK7JoDd|?M}Bh=N6VS?w@q*{cD8>*={1uJDS8#Pdp*+Jwq*oXZE7J zpsh9{U$wNeU6~e5Z?SS+5`2D16@RVlq_ySDaf=qNEUd38zx$wfC-&d5m{v(%1mI@o(M zdQbUJneES)2ZY$a?Vob!Y-}}u?^(IuvvmY~D<5a&Uz{T>ZN{(gd(xe#)}uluY>u0| zW2)Y(^zH0h^^3tkS9YkD^G=7qal)bf256&{7Zy1DJ^ zXBDNj5@Hs5JIdvIpK&j2b(-=;W|schzP`g-mhLh*HF;0{@AExpxi0(_4V(T+_081K zo6r2YpDu0JH~s#V@63$nM}05ewYl!!>* zV^FuVX^GU0qQ=tQ4I9&TUlv|mo=_Uq6nw4foqSe!{(a?nC3+i{zvV1j@?DwJsEcJ4 z&%NERCo4Xf=-DEb>22#!|N8NgS4nHa*Ikz3+ibeCb6ttO`T0fjtv?=5UT67#8%zCy ztTp=DUrOKK*}Yc#(t}AWZ#QY3{C;2-QyuFcIS-aYTU?A>_QW~Gd9a!oO_bozd$qto z{OQy9eV^t(I@7s0q2Eh-X~E)6`-)QR-rTmkv0qy@-{0+GN-6WVoCl1oO*aQ#^mjN-;47&Tq-K-ebM#!1uTs)9P1W z2^?2?bqW*^^>9>;!+@wwex9s`~^OiF9xa$h*?+WbFYL*&h8zCsh5 z*S*@YF5ryxw0#lU>-?XmPg6fX|L~47sWaUU^Z4_>{AIG6p|U}P@#}<}Ods6>Kd=eP zoGdI6o)(svC^dua8pH3&Q~oopIdS!w-O^Sq1_lPz64!{5pLGb;lND-#o419K|_gR*Jo++i9(Dy<;87>o=I4Rj3*bqx(e3@ojT46F<+ zAsSkDt&m31kei>9nO2Eg!{VsBe963#euX`w3zh0Y7P~?*P^5k{}y{^V3So6N^$A z98>a>QWZRN6Vp?JQWH}u3s0unfZ7faMWsc_sSJLlW%)UYYy3?=GB7ZhASB{LgM464 zE-x?F%S_JC)6LGzOV>-z&($v|%FjwoE-BW}18dhWv)uw}j4*h*`njxgN@xNA9i!o8 literal 0 HcmV?d00001 diff --git a/icons/poweroff.png b/icons/poweroff.png new file mode 100644 index 0000000000000000000000000000000000000000..dcb0cf498d505de80b001a47cc7b15f9b937ed3d GIT binary patch literal 10541 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 FO#sp}19AWW literal 0 HcmV?d00001 diff --git a/icons/presets.png b/icons/presets.png new file mode 100644 index 0000000000000000000000000000000000000000..1c1ad191e19ca55ec6d19cd33a9976cc0b1c1231 GIT binary patch literal 2096 zcmeAS@N?(olHy`uVBq!ia0y~yV2}V|4mJh`h6m-gKNuJo*pj^6T^PXNr}OT51_lPs z0*}aI1_sYdAk4VJwF{(-v#h`|9i$hGD}0tNV_;yL;pyTS;&Hrms&~#^chO_}jg9|5 zuf1{oz55%LzRxQ*OfvCv?dS*y2wc^|#i}9~E6{j^snb{djTVcLhmL@bmLdxWr|F`p z0*g4hJTg~>WC}^$YBMR6`m{mzcwh4U*V*@<|2H*mZ_S;xsK8|Q%{lii@0`!M6x zUn7H!w(aKif7DBAUS`(cFI#_Q;%nVXKLLr=zQ(Jr%B=}mZC=-U%)EZv*|@p$j#leG z+UP33+m>}sO&Lr5pL?}6&vrY0_jv!~-@$bkonu?)bzV5ntM!s)+S<;|J8osHJ*%@; zFD7oqnLm%;J$m$JV(0QrE33l`9xng&pV{x8D)qhnbm#EQ%jIIr>ONkV*E?@# zwS}eO@OkbdoYud~-_@2Kzwl1H$nyEgDx>~0*Logvy{^_{-*{_kEB5HN$9_P|K3rud#vHI0}@z?M5VRlSgeoL}{%ds{v+wuDMK7IZxi&@oHTJqHJ z)!uJwJU{RCq0p`=L2H(vu1|HZ55L;|o?rHH&O06jhJ^d? zYQ86YKXKhQTs9{6?B=IecAZLe*DRAgy6&-qr)H~w7uQ0Wr6-DI%VgW92FX-Z_LS5% z@%PMmar1Kdk1N;uV&|_}`udYL!;6;^cjohR&0p=F8eY64R=-7nDTqU3r9wwWay07! zAwh4=UXd233$C}f*F?R0^>59iEAArd)@+CCYZIdrznwC5$xeC{{Y3oGxx>enEnZu3 zmg#}JZ<2w7i_4?O{BtB(_fO}``@hJ_ge|H!?eMO=E-eVOjPk*Vg%ShPTZ+IBRC^L3yFcxA(nzEBkkk@Gey& zx5H7~C-tnZJjiHd`?i2Bs8PJk@b*EA+{tOo$vj&Or%3wtX>`c$b$@#Ap>Usokk^l! zK2LLlIogg2|2=;9;iWp&lS?&v7i?|2##VUE%{uQ_=H%T93R6@hrLqsHcptd%`s~(c z7hWz?-##y-+P#0}oNy(E8&}KEd<^BhyHj@4{vGa|K^LNweS=dn+uW*IuZy35RQ7cK zCfTb^^JH3*wz)~?ZoRg_U`m=)P}ZsHze&;OpVZH0cDN`n;?E=VokdeXu*b0DF-zf` z1u?Uqdta`9P@ewZEoev14T((+7tB^iXJ?&pn3XzZiKc3%)8+2)pKtl=^G|KHO#64D zTvLXj;hI#T%;LLwN&AYppa1(S6hH5;@%6=_NeYHx>!(a#7;2rj?#7~-6P+U0@*d6P zQd*>?wWH#5sNdxyGIK3dtF7HSIuh2l8nQ)BTPVBLaBs!b`@4Qx?<@OnV;)r+WW*pC zI$38PbMsP(>yh;>WZ`1WSOGExk$rl^VI{r zzr}yNzh0l5uM^{>oi%A=n8;xv<{cYut(h~=Ztj&Q4~5rVop$NMdHIqlx1>~aFS#9# zYD;xn6|A%NuJhVRw{tHQPcmMey?RI0d*8a`SKDoZ_qhcMO*V9Esgv8eAR_zt+4%Kq zLhsG0KQ2}IdynJ&l&J49_w`#^ot+dsHn(iKwxm}zSywgE$9t<~$ZPKanFq%XvCi53 z(?~z$eZZt;N6sAjUNeR3ZkTlKx~TZdk294u=GUr5PiJE2t66TbC-w9Jey*J#vfnNd zG>PI}5|w;7K`qLBhp~i%_1eW#*EKpUS>o{E=Zh2N2Qzl6-r`RAESseWck?W)&=Lz^Dz`Kan@Kekj?F`s{$_i6FY1N=6hV#N2oKJeY9WnO=b z!~%h5fjr#-m-=6?{>XmWe0qK5)2*LgKb^ge^T3+=`qvCO4lELjip;Y^+lgS8D6k7w_)8J@q_@8DU$ zsBn|v#aUjnb0s?|GYOxuMEs zCj$e6YKdz^NlIc#s#S7PYGO$$gOP!ufv$m}uAyOwfu)t9v6Z2@u7SCgfkE~!zFR07 za`RI%(<*UmkXpVije&u|1Z0CxW^!s?aVkSbNlAf~zCPHl%(B$v{M_99ykfolqICTn zh>~J`_W&P#BRvECoGi8#3=9mCApODlX(i=}MX3zs<>h*rdD+Fui3O=3ZL{CmNHH)l z2tyQ=7A2=LxcmA0y6QUT=j0a^ubS!dh=GB@5Fs5O8sr0aMt(}FUV46hdQPfda(=FU ffqr^ker~F6GFY#Efb7=Spqk&))z4*}Q$iB}TvEDn literal 0 HcmV?d00001 diff --git a/icons/reboot.png b/icons/reboot.png new file mode 100644 index 0000000000000000000000000000000000000000..614af5ce9d747952b527e935f8b680fe4e2a5441 GIT binary patch literal 1757 zcmeAS@N?(olHy`uVBq!ia0y~yV2}V|4mJh`h6m-gKNuJo*pj^6T^PXNr}OT51_lPs z0*}aI1_s{iAk65bF}ngJSXSVe4$=$86+TOsF)*+^_H=O!@i=~UN^FiusL1jE-;>MI z%hSra--_J|(vV(orAaYJ;B>oN=QN?p11tD{CGqedlX%oTOT~|d)86RIPfxDQv7GQ}r}T2Z zIo@Ao?unWGXo%)Kb1|6x1T&*{xqO{-@|ybJ*S=OgzxDJ?5z~!%4oig;CJ601wxC^O zkz!ltN}Y3m3^IN@&Ev@Ya`djXyy<=^i~el&-y94ds*eWmb&reOqfz$a<~&`tt0p~u z(;jehE)`i465zG)O+|p0qi1WIi%9kNHyv?1Z2nx@WxBRXCyl}D?8~#vYu?nBvtB>J zzSlqB?DRe-#e7FCR_EsirF{as{~qjyFY zXaDz~)7JHMDDYUGW@OOue4!!M_2cEEj;Zr>4Kzi3&5rE7x_a92S(8g=oVjsgs+Pvo z*ou7)t2FJ-3)X%A;=WBiY2#MyVBH+0Y-J7=DPgO1eE(m@?lMZ!TzHSisYMg*A)HZ;E>4JEfN|X9X08p)6M4RoDx>CP<TKz6`8rx4ClGUws~;vylBE3k=Nkh!Qh}4&BCa6=Jkaa zj*2aX@1`$g&(~MH{5^Wffz}Bhm>U%)e5hqqRQ&@D|qwV4ARoOMUvR6cF;dx0k_UF-N<^ql*S_HZ47t*Hc-Rn3nM8 z`C@sd533^C6tWl@8Q2~!toVCJfzeuj%hB0yH;IZl1vmt{X_~kxFw4(NUj6dqN-sU* zYHi~`vGKn?eLT-_BlMw7!>PUhANaX2%wSl=F*7as`8?UEHHFOmN6Z6Ptq)@f;rzd> zpnHGi(wW{b~J`_W&P#BRvEC zoGi8#Fbg4eVS35X%EZ#jzzE_c`85`93=9mCAPa-@(@M${i&7cN%ggmL^RkPR6AMy7 z_RM}~BgMeLAPiAdT9lm1;O^(|>#FOVpOaryylSS)BL)TrLxgmEXpj%w-T5i0dg=N3 n={c!-$@#hZ1^VfE`MIgO$zZ+u0kT_PgQ_V{S3j3^P6*oLO|4YyO|8xGoMf6&8!>O~P&rP%6c=VaIeaP>BTYg`?S+RfL z|381u{r$V^=ik=nOAmbi@Gtt;_kZVJznstiCocWZ-(4&3=hytzds3%g^PlBzr2Tq( z_LHyw?S1#CeBrkH{5!9HdLD4ReBsZ%ANijCe*XOXy7zm3?f?0?H6mi^)E$8z>e$8K z{EfQLap?E;pW;7XF*QHRe*9cw(@y=rJuR$1v#adyul-xx_%G_o{P}10hyVY+yk2+T z`}?mS#%IsmZ~CbH|1a+8|GrlJ*xUR6^Rb8JF8|)g&w2Q|-sk!6@^h=6zcJq}XRJNT zzI)TN^wM{(=cIHhcgUaqqx;AEPt3df$L?qCo}2S?(`CMYe%I%uhxZj;)V+SU@ORz( zJfkBow(Hk?ulrRHzk1=1XXzL0T>q9H7ca|cJr(D--9Kv= ztBxO)k^dS0&-8!({y+9Vv(L?pQmXuLKFUx}e|MV1Ez8=cu{j;q_xCN`eZanc|J&{L zH~5#G;#;=+%v8=Y>wBthMgMPv?f5NI5&!6Sv10nEUwQ|G3f~_|h)H12DO23}Cgb)B7 zgoLb}Q^TUO_f}ut8TdSE?)UOI$+{Lncd5!Lf$q|^Np{BPOg`&uK4k&vt?jG-fBgPG;rgBJ+5g^6xffnn z-W%?#X+OQ7Y4Q@=sE5=~kVKK=zJ9-`Z#R&z1Zkle+$j15@kXzQ`@bhx}}(Zti=jJ12O%p7nQ6?Kx40 zZi+LW*V3F5DcrnM{{8Y7myg^IKK|%Z^~=j^{j>Gzt5-G{EHM$4srus1hc9h`mdwaT_5S98C9t17a)-MYEVYU%tF z0oPN)q%P}CYn*OuTz=zd!Rn3L^H-njeY>x5v&0eEzkk$BKfhbqceXw|YW0sb;lX#E z?;n2E6qRlM?D&L3UV3w1s0;6y$S7R&=B>`l-o%glAG?JY6dO9PId$_XPuTAVTXH_% z<=or4KEn6y^4p8dmj@UBsQrBZeXd@Oa!${MKh+)oQ(FoR4;gJd;J3nBeX8xNb2~pR z+!eNGy4kkP2OBqTUQ&BPNo3ki^?bqn!+Q+op4>L?S=4c#?=!j|9u2VaJFw%gOnKJw zw-ct@#i)g^;#SuYHdYZ?V_JA=&$U|?Ym0Y&57@Z2HNHdUU5(K1V1EO_>>H*9);#;) zA6w$qcl>ARv8>GPG36aw{gUbwDulJXW-iDmsClQy^7;H(7T;4-ce|y2-Mu6!?%k4& zF}J?m{35aA$OP{Ok*d_W^7B0eW(1%0xxM>hmJCnA_AKphzB0+1H>&AgJ`q!p^iLa--Si`8n=a8r)AVb8XiQJ2q!>w9XglFE{@)wf_HPyTy8|)c20dHo?WMs@j+B zr9Csn%M!Ad-mj9FzDTc>DD@sWS5`Fuhg%YGa-3D@xKTF!aVD$z}3QpYi`4KDj~1?2vu*DhB~ zSkrTN`d#(U*4BGikGEvKSaWF4H@g}3jv1;yOEvPhGvx2A_pUL1U7;r&lqO_6PiA`d zgbRxHaZai^2fxwB_J^N8`?Vb?zq?r2WyZ~{qH~6M0m45XpV`;=ydpbs z#=^wDfW=d7B_{N1&NW@pT{^F4YUz&XcOTwvQoP?jLGSsj*4F>AE0485yRyI1an{`f zedlb7LlrOX>E2N*C%XDv`lo*15Rv(u*Yy{xpFi&sE#cU9Lm<3EAmWgLgTn2wO**{Y z3A`NBCAX*={b0P3lyhTNYeh+1{?Sy8eV_k6u+`lBQ^%>`xXHCGKlGA=Mf!DA11i_0 zuD^Nequ=aZA8VHvhy+WUFFL!Vv`@p;!)i);zYjHPNLIJ6UiLZQ)6MJOY9&%G z@G2?U#+98;J>S;yO?<$%Kh|QW4VIH-4D=>Z1#f9=lI8 z^Lp>@?n}GM|0m>!@4xg#Gx?*=&OIDlqLV)gtMxFglt_N$HQ}6YITK^JKTB9HXN39l zLn|JZwY)WroVT+`y(2lEM}>FJw%u&nxhwWDO!e|OR`o0*XGe2eRHSKR+g@hd=PlX? zleiyVJ$L1l)b*LC4H_=JJAe9(r{9M|wo4s~s}gPUEBEkRJIZzU@X6E3Okbnl>@&W% zKJj?F{$rKjO$T}Rig$=`Nkk+^FBDs|WXok%jR`ySFO+Wlc~+W#^QIl@+ts`B{=YMr zzgJ*Uq-dg^%>0ZnEt}GVQ=d8q6oehT-CKY74|n!4-WgjvBqt}iZU{@Nx+bo_Z9bEp z)sv>M8xsTnDf|hvX`5BO_K{h+%sf7%R4a>rnYWr8a8ovHxab?f5+ecMCZ&2%> zcYF=sB#u)#-;Nd<_nbSK&${zNN?B{KjK>^C|9o3!Sr_(-iLCMtEN@nD3%Sf`V6oq! zc!$Zad$Azv>*VW?6W%Tq{JkuDgPe+T+mxv@Kj_HMk!5`uB^{7^Mf70{<6(gW&t_}y z=MOgjeWt(e>YGoIXIbyW-ejmSYo3+qc*C5pG3S67$NdiyE{fB5H}3rMi@`HLvGCu; z>2vnmr%ao=u;T$6L+487{>OTWK8bzDt6YUenG?Rqei79zV0dYKb>WYgdCK<>`U>2h zm)h`5v^F4OTDhU8+Bvz{d4(ILe{=@g1Zw{@))zE8c52cm$CRb)H?H+{`8#YZwqt0Y z_O*H8*C~%Ub8Qq`7qleEJ=(h9>BNPl$s$vD)@4qbp|arosp|(RYXkeg%@eXW z80!4aIlGiA=hpH|E;qua?&;28c{2B<^EaL?X-z-8BcL8jXq`EZQtiP=j$S+7uRb(&TJ_06iu2t_iSP= zlTTb-m1^`P*YD{Y**X5VF1<5T&QQPRsLXQZkh{Tt zE$)u6aBNd+fSp|Heg7u4FP}atUY+pfkh)Z(aIn(^=?iL|XBMqp9c|v+`6<)K&?#$& zgm>prx14$BQ`WmonJvL)&HV4tNB1Qcq&d}3XkGTxe2^p{IK#*=RUrSd+mR{RFB@KW zochAlDCXkzc)`=obJmtQWuEJjv)^0_t+=>cd)-}b2~W)lP8Lr3I(H?4Jp@hnZom6> z2}9AsfZvlNKW9nyykygUueKzCXWiUpA)Sue7@pG`9nX|`F5fD~aFVC?CCj=KZYItT z6pS3cZ&KRVuG75qk+9tF_!T_&i&I(reC~fcw`bYw?!2Gkam_doeNZ zkb-p;Oy#_{E?1fN+Ugelv;Vdw?p}P{hp9~wY^EkR(@*T^dD)oxg!LG!@cnS*14ozK zlK%9}rgP4EL!UddX55=7b=4&Opnlk9t?<%4lbr8dPR=;uYa;&Zn0DoZr4x3pe6l>| z>1FK%<_+_i^n@HtU(An=5H>VeG@D70^G&2*(98wr%lMv7GutzDMZun{Pa6DM1x|22 zODIs>v8%_L`MJ=t-!+Fyex+a4JjiCa#6)27PXF!ZiAU56ntn`Cp2*I3Gv)v1M=npF zNgPt?S~ykkaaXi-BVXN-ykbeEYT4RtjDifE85=I`&2&jM{<~D>+SOR8vWBy#*8Otb z&-1HPJpY-6p{-u&^)~CL_3u*FUOaoOBB1WGq4~*6?~e&7-+K}hrDZtv<%YXw*QFc` zu~XD#e33Hs##S+Vmbc=Lwn=jr#4dOq5ccT%2jRQo8zOH=t&`$VY+1lEWzKP-n>$mq zLf+5Pt(xr1$aY-R(mrsStfz+OH>3A0O+7B}9_n71m0CCFGee%iws$vbRvhrU?v;P& zjijdHUMrJNSEsKCI&=Qp>Y7EflN@*_Su!=dFBjVMmdUM>we(65XT$P4Q9A`QrtazD zICr|BdC^%W>qI7Ik!*E^{stlGUq(F&9Oo|zbZm*4V&|wYx6)`uj|yv8_)c}kF4Gwv zNe6#iF6+uYo>kK3S>Ix0m&L%gy<`USoM|4+$t#&|HF)+|3MI68v`1{VLf;Rr;7`J$t5$|5y%1Y?O77;NMQo{u z`JQEqx9k@TUiG1I1zT0|^x(gzGX$+R9GjEAt4lNe)e$v&$;@$Cr_07 zClG%@N>OP`g7T4o9zn({S{oP3o@ku5bXG;uyPWi+)+v9~UoZJ|)&|C#sg6yR23*#iJ_Zfx(>~1RWZ*Sx2~*+fHR!N-5&rQZA-w35z)fZmQx1E3Ph_{pk1SrST8--(HfkNC68!~8#hxzR6)oizP$N)%XrxeHr9Bo&o=(`)aS#}h7N}=qoXmhdP2$qFFQUkWN{08 zjkM8|w^QnGDF}BGaGITPo;9MZbEd8ei-Mw-_hfOQ**jK<%nAQ0^8Y~2hwI;5Ygf$M z^xv^k@lC&N`*|nPixYp?d`o|zH_7Uu+f~ee zP?oDoAB5=SY+~PS?i_IygB?Zqp*^^uj%=1cK@qo9~*kJE& z?uPu|dOuj3?{BGI%N%6>=J&C(HM&6=8}G7S5fDntVOuFSHEP#I3BBbRdyK>acZh5I zhWp&tl_wio)OR@|)-Sd@SgBH`OpF)?7q(sr&br=8k7&tgX*Z`x+9e9N6vVsIu_q z!t$jL{zjOj_^fT& z`|?BAm(?fj3irC0e5XTonTO4HQ>hDl+-ZMUxwqN+ElvEeeOF#pluY5==x@$49TADs zHY6TXxXHCIZgum!5H$USNhbv)tihT=pMP& z*2>qzb|<)KO0T2c>YNV;B@cWPc>C&N=Et<_<{|yMJG<{5nakQ|^hJNyxpzB$6$v*7 zb~>!O$?;SBi1VFaQ%#Lheg(;j)$K{>)N8KrJ6`*wWt-oJ%ki6<=U&&&+Hhr2&Aecf zhwhQ@p1=`{4TdUZBxr8tenRa*0yx>Ci9Px>pl9DIg=E&x_>lt z2|V`Et=H6F^xX7Ko~94&EL-d*JAO1yyz=$j8Oys0Z$i(=ui4nX?6Gcr(4&PG(hJO7 zW$h<>NPql$(>HL*R>t3FAAizR*taFTX4h)wpj}dIAEHvES`9>(yxO)~yX#-5iPtmr z!ii}***P7W_r7_ZW|`qJ<^HL;>#7V{>bzsw6q#Flr0uvFOjFbMSudF} zMKUn*#j|yS)e_u+6-{~{^vtu@S1so8U->y&(NuWREB6}_PlNp3KSy5m3vkHzW2Ds4 z6#id^S9F5$F}5{M&7nuX^LzRn4_Wx@?D0s>%ztMT<@#zSX<0w&PMZ2tZ2!6yAB?%#4i*KQh#9>dXT>4#+dwZ_RDUTh_CXdH;$- z)07&gKj=N|=k{WiOGL9Kj{w`ANtzk~>`X6%w%9T2numzJ4&3z6JD^N6?nJ*z>b@PW z9aYzKa&Ok%Uzs77Bsq1v#>1R#QHpQQu5=0gI{%q)d6LwLz7R+CDF-!9|BRg?%68yN z&8JK25|py)O`KmGT3YvR^QKjjKc@V0?a;hnvVCfG!Upxbe>`eWhNb*cUAcARhr^BT zKDGzmxvSVceC*}1N>4IR)j2avLgw}v-arn{r-A-ktvSP{U&^_yxcj?V<-KXbJ&bj? zqPG@I54YD}RkdMW55u?eD)B}8Gv37A?Ac+pf0BWgwXUo2^GKTpK40DiqV|lztV{PO>P}x5srp60eag z7d39`{lRy%%sZBK-Ighd!VG;r+PC`FGi@gdbbK&pm5ee!*>jcma#Pn#aN;1z&Os zlauG2We{Azz3l#!v#jf_-c77_V?Lg6wn1yL*^L!mEF~=SCf;;hqa3!QF-dl!aQ1W2 zugMz(lVV&?CLVil*T3Rev|!`fSIPobZ{9vQG*~}ZvV|i-KVS09njc+}=Q5^wov2`CJRKiq zH|18FN%now?#{OC{e>^C_dM1t9-JDm4g`XZ2kL*8go; zm2|y3>*w;w21w@blbPk*E^+lEo3m2G;S-&T0)2XJ+`NhVUA31I(ADPo`-1$-O=d0Ys87JnQ66rqN(YM%S?V4FU zvlZu9J~CFZPmQ=zX({^jJ;Or=`J1QCDC%4hUdU7Z;o;6l{I@@CkZ^)+ZQuEO%@ z`MYMG$zl85KBB?tXng>5fWTZ=dYupbS|Z-fy`x7dUaw zc~SLPa(!>%;S}i&w-kPL99w0gBD6HY@8B*kmi86b_lE9HT^qD9b3cnma+Z_c4UX0K zIoCMEhw@geZ!-(nzLNQV`;o`KmvmP)U7u(;Eoeu4!rX`6Zj$Av|G!;YzSSI>;IdUep~hKk~ON zA>B=L)m|k_RvWfmvv!G1^D^?uP{)&oqJ=>t;Va< z7H7@o5)az;bZeDH?rN5%s4ZsF*P`z{ENWu)&y1exZfY~_cIB4b2aB6Un{3X=m$9Vv-qnuGx)Ne8r{F8;eA!o z#>U5Yy?g8WMQK89T%sKuGT%5YMf#00DqkGd*0L{)mdw9>;pgtD7oB%qICScW;Lq!C z*RKui^lv}ftWx24>EAAe-GNIPzoz_iwmZ1&%6j4X0Rp8BD~vxX#CSZKb(oQBO@_Al z+0w%dHov16O>u9HQQw>S@`B^`$Sm&QX}Nl-I!4<=cHGLE`nTcyv7O2`R~WuDXl*&L z`p4tlPTNiyzjB**$?izK3{#K4#EiBsVR4r8LE)A+wy^~MmTw2we*e4&^+I7>i_81Cg)vc;h6Ekp~DE#H4_=V8u*-uxdiPBK4jOrDi=*}Ox3r~m!0GK)AO3UQQ`Hu3jY&GZCwkXPOuTi)!Y~-z4Ucm5VqOhK0fu9rF_BhahjS%% z?e}GuTk>I{r06vBV~=M+wTXZjuttq*#p7J9GQs+%%l6L{`fP5k`||5b24@G4#t9as z3(sG<9CTP^4$nP?M}NLd`MTRQ&+LG`ru5^h{SB1~r+9X)nzl-*Fi0`_c!9v;NfY%C z_h+2{skY>L+aXsQ&Djs9ny?zGeF(VP)c7{x-szQ&oRWc4r2~(4&$Y_Z@3K<;v^Y0Z zG$?tgF~@JyS52Z?%B@d-TFgwd-Xx(KIPbRGm+wFQu1)!n{nWf$sB`DZ1^=1$NliKb z=a*32qW|pIj`6S2d@GY3#3$NbsViL3nldL_dimN{CtPbR8^fz*&!{GE7Teh0=XUvx zhW>`vY0KO>ruH)hR_xSR^{Z&t&fLB0?y%ZEed)CIe{JWEv-yVWHLk7p`)#AYHhF8n zL3gQdvL2bouKtzsIc6JL(tqa#$07C(em;AH7E77H*Q=%_G)?yAwC`nF*On7Qi-!W`1oC-kSY7>LV?Xv!e4jy1WCNw;eXlHbN_;3)~C1%fAA79Xql`dPg>UuP~;qtTb!FQQ7j1+?eLENEQb$^9y3 zt5huq+ZyRr%YS{YQnTCe{#nxA3Hy?~mWEwhSX$|2o#Y(czKG+dx{O|khW(`nW3|FT!7sZQmnT{&yTDOr=1_ctB7{x3`;_kaHzzouXPx(~7aA8$eWOeH778_W z{@iyEX8XAd1w+uiv*eC~Y#qps|QGotEW8fbi7+W+9tp446I8`xK0oB6JN z!j8SSj_=;2_I&Hw>Qb#uEwxoV%sov{#n(JeGrqPyZj*%Lu{T#_vgS?Rw^;9?%UylT z7p=SGV&%im&YpXtQ}ajEf~Ey}lay9|oPJ|nTHcjcv)X=7b^YRZTz#9Kr)Q0C)z_`( zbZ36}y2~Y?D|=Nd@7EWRUu&9I7)^gRJ;X0EyZxwZhYE9m9%pg5{2Sja?mzMTe_l8E zf8MsAS%cd{QRe4qwg(qXyA@AKn}=v8Et@gtoN`4W+wa|fUY%iY-tTNZ;n{3+)7LlV z=XtC0#n*p)UCSXDwe&}rO81n=tN#>*w&_jyr?Ky_JkKtMi4E6R^9YuhwZ0APXF7bT zd$0RdtJL)jyvxMCA9a7=mKxHOy8REw2Gd7rs$!+r1;h+q>1K2IhH3JfAF%-1hXYv!=bmhSqssAPs? zQRTdHqt8G5*M42S-0S*6ho% zkzBP{pSfIHkte35bc2<0;G4MjD-NFhvc8%ptU_JLBChmzzfk|HE$_E<@BO(gWm#=| z!<~_yF#bQS*C>i;LQu7 zPb^FGS@R;h`i(h@_jU{ZcAfi@^S@3k_IVyQF>jOCaoejKG^dB!Gnuh0-o9Sv+pWKE zu8O%CElysSuy2xDbZwxJmj1>MpB^wSIkm=9#ftxqklw{3fwl=2+e_kj)ZCXh-*#00 z_CfgV)IE_lDK)uwmC~*9N*+&t)$RT1Zz$`z>54~OIaGg7YpLQiwrM!N`}g^ek8e+3 zA+feu@zuBALK@z;x~qRyuaGFb^F#T4!1;B3pSR3#SobDAcCD?Y#c6BxzyA97wemF6 zA4|^VyY@1`^$MdmQ{?7%);f!FZit>t_-y-s%|e?}k-DmF3uT>ki_1)JPCof}(FO(g zlRrNg7&WI|I&?%R?`|>6oYldeex>UdHNRMMYZv>UUsHaWy)RhHZ})e%X0=V$Gx1~X z6JIuR^vpdfcQ7t=i{R^=Rr7WSq)rIrT@p99I(h$OMX9@gHCOOzyz1a>5!h)hyn9~a zLTdT+sZP`X z8~s&6N&V$wJ)5N~Yp)2$-_WzIf8t?Ym|cDQOSP?A*OHY-8Eu_YF8=JbJ=%Ko)5JLu z@mto5q)fd&>4<}+rpGF?*nPs!`2Q5D$tKTwRofXeZNa&&2WfI{O9a?lciv3)~=hL`~21H~G2bZcTIEIM-^6s-|jU!d9z{m!)1pjHg{C=d}79@=Ef5H*dy) zrMx$GFvh0bUb%kTi@!6Sj#hi@X7=J}Eam>|sowYK&R03xk4bMFk1y7$Icg)h`D)mb zD@)F=PwQHFf6_V)-k5-^^Ofyixs=EM%To_Nws>awyVvKp$>ebylhO7FIkZf$b5fCU z;M$-9pHQEpImX!wA9pv*tO+T8%Yom*!th2na}>@$W*Q zK$z0Q6=wI0lTY1T{GxOYFIR-<W}SD6D&TowwPI$x{{fBi3D;*`(JeAQ z`1?+~%8QQZALT)(Yuuwt8|u5~eY<|}(`4>*EZ>(I*CZ`>Zujq(`^9{`!D2_(o4l;Z zbGIWhTjCD9(rV=rs^K^I@J)6v%UkouS;j9DeO54swS8qUR;%F@4!Zx@`o6x?O8rBX zS5>e3GrdWbSr!z?zp?*6pZ4ocg{N{Je=J{S-V5{(F{)~ z?z^b=aKju<`}7?T*pA=(7hL1D_5W=qo~=`tA5L6c_2f=V;riLfCjPxE{NMlM%(e55 z{e8Mr>C9pcnO7T4vkry-H(YT!?_t=%-LDM1%C>!5la+ZnpKVpBEJsJdo<4^~>}@Bi z1a?b(Ue75I`}ymkkLPavX3XzXS}BP8Q|}K?X%^Z%*_&J7 z%2Jl#{@g2TCg0iKUZN0x#>>D!FI(Pv&G(10``_N-O5J@(_dw>p@2lq3ZV{-d_dTL{ zTH_m+r{U4n2R+>H8vawC`TxpktGxx0m&471zc+M6%c(nwTBtDcFqN1wT(ow6^X0^% z-!6h|75%5{jxA^3a6tXEZt2f8K`z&tJIo3eKYn5H*pA_L;B=vPVt49FKQFTr;oM#A z;rMdb%9K}^94$R&Em)K^W7X_urSn}MInPg1iY*E8V+D3dpkRoYB$JT;(PEh^sN=$`WHq{|@h|re7}G^J_L7$_anJ@K#{n!pO8P zm7pSJ(FZ)MnXM0cCD|{`)ZePed{QH*VTrcM&lSwo1&gn**MEFtmF!82Q{NR@-&=|w zIXJIdF>h7>bXGkfo_9Az{_k$%xE~&rdZ$fR@%)BH= zuz&fxQ^|ii{Ql2f$(|q2CqDIW%7H7D4h+6eV^73nX+^%eXw@-!nazt@hVw5NXK%== z*>(2|v+|XjCQ56MNPN!tX8q#bdfxptlXXtqk67^T-1k%83+BJSXjhY@ZhL&0^twaZ z?+dxA4h8=E&FLO5zpQVu&7NQROSU+ie4knMQuImD!~WS>g54g1%haaj&pgmNYsZEk z#})}X$OKQ#Ql4OL%fkC8vE<2P+k2jGOLvxwE-d2k?N8Ryn7GK~adiXhyI=cj@+SQ3 z=sEW{Yr!Y?$j_Txt{2=>F1J&3mf7Z2cc56{zLlDN`U|1V#M0(}fv4YGxU6i{m|f9}>8 zgDZN+H-G6fM|hwA`F`ijcjjfc7*_BI95|DFb#Y0}ei3c+jc4uqHXokAvGBK?%Fna& zW~`qi+kUI+YY)F|>S|f>-#z;nM*zp?ns}R7jZ=T$mQA7&Q;F0 zIOR3Tsm9MH>jG=1{7${ye~#^Zv0;9?Tdz;mJPR)!5$lL|31LPdk2D|6Sd=y8{rO#M z3hq5x6PC56)c@b1g1G3&XI5twRW^30b_ggeZZp!_Ah0}C`KZgRZ^Cl_9FOZy@>UC% z?2+MK;ne!%$HD&(%D1N_79H~CQg2u%e*2#Uo6~NG&3U))AK!M@hLP#~fvMNNg-ahe zqyF;iHZg0as_l*4ueYhaXPj<*;J{=($w|tr8Naw$AN=jvr^){1K9g;BUjEwJId%+^ zue3^;Wn`F?T~Eb*uP851&;LI!^XqqJlU+r9IhPnOGcYi)C3(BMFo3~N=iT)T3=EtF z9+AZi40_5S%viD1zKnr^fxX1j*OmPV3$LIa-}Vg&t_%$9&YmugAs)v|r&R}Bxh~qU z|9*e0SlRTa8@YA3H3SZbAKPGO7#L`B>zd!?a}vgvd(@0?gb6R!T#{wF%+pipYv`J- zM(1W6T$ZVGtaD?DGA) z-CA0cICoC2xMmYw61jWs>uc+OXZ!k|oz>LD)Ya9cp{-qgW{Ue{=XSor-Cy|<4|#Ha z{5ZYr-JPGWx6LyGCh=FJgtxwHfMhd+Jyi;LPj=j+k@qR*GkR>xnj-+N_7&K_ZD>C?-6XUq8p z#K-$bM@x5c9KEoG}XOO!5Kb7E~?-n%mk9|(B0GWACJ8b};@ zS@cL&?$GOR4@)dwy!iS^qNYRrsH4|AlRNJeeeQcdne$ghJWAha{RV^0J9bo*`}^~2 zhp%(Fw>@7zZF8h756g8a;~o=JbHT-z7hYKP@rTWi+Pau#zdL#SSzBjqxsvnicgzk| z{h7w|)Rr*xpLKt>sKn0Z1LG+d)y$Kb_E*(k1sfR|Pq3Ba@9pJnP1|hw^vKT1Dz7IC zUgF^Mx9{?psW`v8LBHYeyxxZo8QQhK3D{~2P4zqca+duh(|jH0IQe@Y3~ntIdTkef ze$LP0$Gg_v?S6l6U$;&1HJ?aD_jBEsRxYZ}vF%}Lwt4gZ*wZZ!Wxol@aSCo>eQ~wq zQU3?yvW=YaP7JkaOv_GYu5k96R4mM~JJcq6M-#gox8Brf%VRU_>Z=a&EWLB@p4>`* z4~gerEF?MGKKyQuu)2M5)zyey?-qrZGoL)U0kP2HYU=UMm3b2xE2zFQUbv7e>GyW?u) zFCD?I01c6A8K#Hx*3ahloo*n-Gbi8v;HOmS3qErWw<=GS*;g{hbN!jr%`aueemxhK zHrTMTRQMJP@5frUDUpe{^dm0%g?^SPKG`*|;nsRdN2e1D3p6ymi~1Gg&OfaVFQ~Mw zurcB-y*kHcPk%}<*H2B$o_>8LO~dwL-uR@B3(g`>Qtg_R&oytm?$8pbW~$aZnOWV_ zc$u@ujl)VZQ|?Fnb~|ABV271na?Ovr`>||qm^E4_J)35|;!&GL(WY5{)>xXn`zQP` z+sseK!Zk}_D(kbKcV6bCKH3qJ!)ML;(o-WOFrne)$;%rof8|G2@BUMinyPwsd)^;y zwJ7s1xBRaK1((YN-wEDQd)c$X!?{bVyZNfSWb!PhS@&8rlX#|ef7j%)Ki{xuzTm?p zw?8%*9xKVawQjSoyE>reK+KKmk>XV0#mqB_ee)@+NG$<q`!TUYGAqhPlFeu+qjj;7|% z^;P@dCO9yj(U=qc!}aJpu8T#lr>$7CPNc`3;nCW?(kw6gi`10v-H%qAwJuJ;di#43 z?q@m{ygss1Z)kkqXe2Ey9l0r`^GV4rAEy>|X4V6ry58^$hFP2Tfn`8`3}RbMmf((zgh(zs?WHu=O%yg_18&v^TL_39GG30wH$t( uH)UjD;D5kc_8opQXzf7+7OHT^vI^j?bN1nG+H!(!T%uy*HQr z(q9{eM4b|HV9lP$q|3@0?Q$h!B{#Fg6^Wx=+>F82A4v?!vT%m&>e--^c#Hkff>gLVxE@bM^hz`{oq;7cD)0&6dj{F;I|y zO+=&L^2582oW5}}Sz=20%b>RGn`^fVUN>2EafXS+>2v#Bc)p*ke|MdcX~&%Z%SC8ehekzyEul=>yyTBa0iRdwIXFEBf{(QrSH{ zRj}9PS;U!T1<8jM+w@W&wQw^0o?VwK6&Mj>a`dTR+>Ptvb;n*79An$8tE0E<)#Cm( zCN8u5l~wn$%nDcRo5w3{{?2r!?&96djYm98ez9#xy|6;M=;b;u#D<$W8MEBHyo{#%&6{&uy0fozc_rWSz6Gf(3N;uW?0h*{-Td9R zpWEJj{>kRxv1(P*vZSq1ZNDywxGD;DE-;rUP+gw*^1Z!H?lGQKtL)bNFlRWhEj#`E zob9F0->v`lvxaE`gPc)xMX05%O60?W8P8A0FF1Su+^zQO1)EmSUhLj?=iWPe!JoS| zrPi%qKXdBz`IC)X7v`SIl3uXp8y8#1^GC;av3cd~YyHxrEu*!u0rqc3(mYyKTL_Urog^{;ZQzo`}2Z+P`yXbv|+z|XjY zQ@`)HHr4W7v`MOq%e57EEybA*T4rVj{roVEXSzw|TRnz5>r}o(iK{VN^terWBj#k- zI!jKLb+-2I>o;D%+4Y4-W${Ge+uJuUKCAzfg=vKY$A(#{DY7?gJ#So^d~Sc!H?fP4 zSN}b@ul&6Kmc0K$#dUVuxb+mA*9*4?2kSoH^?!ZC;^VI63D?(iRu{#moxc*=QmynR zZlBEKqmxhU{>#_1=}xtV>DEv6jD1_WKHR&TTUI3`X>UKd_xk(}sbioGx2=@Pu?a_zl_#m8N4m*4-j_HS=(&nLg*Ycg2uR_;8O>Gi_*?d$5b z?w9>)Hs?q_+hdcrYQ=%I8YL@~DsH?vW2wGisq2;Ne}%r4Ty6E(TgazuTd?5P_gQl^ zYt3Friu0(ohfK9qRh8Jh`D5M|F^Ar$`sBCI}+J$TkU&LH9dDjSAX-WUzOn+F0qA%ZH9|K z?)xdG=6R@oL$vplxhkj5*)zzxw_0miUVHcT>z{lZM3;c|9f_%xhGc-E=ka;EPR)yWc$6(0rFs%(`4nrDDIQzqoy` zy#AuP{V#6r@@0AcOkmFJ<|#otgc|NKvzskH6TdwmaPgM9UAw$q|0?Vi3{sita^&y}4ByI&Do2>mSw$)_j-t z{XhMYi^H}=O3{duQL zzx*ZsJv7m1c-UX8{@>9p(k~J`ANK$seIq?Xed~i;K(!FqPY}y6 z{bXWgY-D9<0*3 ssE7{@@_{)kwJfzLF()NoFF8L~KN+G^f9b@@(V$w-)78&qol`;+0LXPT!~g&Q literal 0 HcmV?d00001 diff --git a/icons/unchecked.png b/icons/unchecked.png new file mode 100644 index 0000000000000000000000000000000000000000..3d2eb26f13c5d0cd9512573aa6e7325cdffba84e GIT binary patch literal 7277 zcmeAS@N?(olHy`uVBq!ia0y~yV2}V|4mJh`h6m-gKNuLqnyNw~N`ey06$*;-(=u~X z6-p`#QWa7wGSe6sDsJ7K6*)=8vdHCsA(!02jm*anY8{gP@S}#SA|+M#?wpA)^~1bU zQ+_b9=L80u?uh*V`Tp%c;{PZ09&DN6y-L&e54UN^^&g9EzQ^0{e=B_M{qLv6=l<2) zshL|K^Qq?7Z`1AHe;xby<8j;i!e8f)`&ORc@rm!tydOL-zNQ?P|NL9U^4+^a>3fZ@ zcGWM5`t*HeS-Ji3>W4E={jRTHHuZh`zS-~DosM}Ke^PjV=hHR&=jA(%KYXu$T>oJE zSD&u?KmW+`$X~o(t|swh`O{jv`OkMZ)){?zuK#)U*Zu!~9sRLx@A1F-+kDpd{&?K4 zp7Uq($NtX!wm0g}p7>jnR5iOU`rPpo)zkJ~kB#N#>|SQRsBh!jbP2sTGw#g4Eo49Q z|HS>Df3Ey9Ww|Z$^z-R9bLS_nF0DwFmVUG4Y~Jp3&o?w{vTcufc6sN+KbB!NWmkFi z?OFfcc)MwR-LEG7_UL2Pe7o20yz%)?)jac#Uq5|LFFj{8zheE3_V(+4&(HtpyyDTpiZd}03Dv)37rFmd-uCC? z=I6UkJoi=1{#3($z{SSeNb>c^1C!VEo845mp1$^IA1k|Q+Pj(pS^gUmcT*VXr%u(WF~H)1Qg(jx2g$@E6W!!euUuRe61j=hUjzxk*X@X<#det`>qcGX?H z2TvA%x*06%DJVO+=Tq;@FuB96iIL*l|9-m5fBvs`o$_r1Ea(57s2fLX20&Er2qXB948xnk@8FQ5M(bXfiDc@-vMC~OWyIK36%rl>~Wm%;s))nP- zO-_206EoFuURc$G>buEp`>w|+Yo{mW*uI@qQ@ojX9?y^RslTjt2r=AtDN6{munj!G zv~uG2Gw0qLGRR6-=V?w)XP8A+=XTREg(>wU| zfP{}m`ds$Sw>R>Z`d{9-Z{v!M#rB84nx0QxI*)U$yca_#86!?lO&vu>9R_|EHwtiP0zL zm%HurvM%y+Ut7fSsovsP2&2xT-)E%kF6{lcYIRld+~adN;*;in@LABVt@uQ$>vd^s zk+@*v=|e#=U40WyX$HzCN3A~l!li%jYKL5ZIgizh60A?fzD{wHEZ)G_p1v&oa>^qI z(Upsr``wA%B&|L5lH%g4!I{(bSsrdu+FCd5LX^T^j@yqMgEwW^*M_k%@VC!dRr4@w zS(MwFBWKMv8h_sR<>X|>)T_s$aoXVDy7HVDWU%A|( zZ|{^nagO5RhTmV@RIGL_t~YYrd`e^W`KuDQQ~zuWe|>T0glIY0I==fS3RB7#w>>!6 z*L8LU1Ec7?yS4|}CLQ337C3k08T$#oiyn6i4svdZl9l5{Po_f0`<}~f60_(i?4XJ9Po30*UuhR*(7{{srBbsb`S94gWAfJL^*$(H?Na{LqW#UGtN)m+kEi;J_oYo!Bpj3l?6%Hbt8E!j z@NoH*OIkl3de%a?z@Tai)0R-X89IU^z_=PE!!qs_G$gV`awGG?4a53@x& zpRSl*!GJs+lQu6|PR(Tn5RZ@(&q-1*Ab zbZ*A<)O*b9CP%8(u%5~5@4n~2T0DKPg549b8TQUB63nYAnY+rgHe@lqn|&g((rOL2 zP^9{Y8>czfmgSVJnf`fWT=m3;t~-a$9pUs_W@lt)+4L}NzQ0dGif@egWr+pme~Kn< zS^R#%FR!WxUIOi>95kOf7A~lc5bkuE=g#hWdTyehr&cK3uUWlVF;wgPPrih$ z6>nUszW-{CXi4bIlTn%fxb-D-k=xXLTrn%94u5^3VV)b8T>mc2YwEw`2l4?PlMXa2 z)IT@j(J8T2=YG$S_wahzv~v1a?L%F^=cG56u^P{nKASJ`$K1c{FPqAF-~D#i_iW$( zbNhDXxyjqb*>@>v_?J(-qM2#XdGL$;Vfo#sU)3=tUY;BJ|L0G!geSKmR-I^g(f@Pi z|D1#V3k5#-ykkoDkP_W6k$Gvp(n;^kl}A)(25>sg@y$D*#!@qzqgYOFrUp-n?GX-E zwzG9Q*Md{cV6%gFZlnFIzG%{MK6kwLmo z>|`w3g&#iCwA?z~cw42#WA^Qu%YF!dclB$%I62`O|FZb(4Gayc!k#f7${Q!_@UV$A zwS2&5BDOW-DHCteK89WX9b1`;n`fL4Xtr%tcUjzXcw=D0uZmSCBIl|3_n9R&OzPdR zqB7`Zv-`wpS9DEge*Jd(a3{YP(^p5ax+DG5Vwx5lIOWG|vGcTxd*cU0SdbslAoZ!8TM^2hGHN2Y2 zReD2c<-VDpA_A-}^6~_}t(Yx%+#yy;cZYOW|Ae@ndrmW1b7U))hrSN|wI@iTfcKcv z*~7tGelYiDO>~f}kqSPV)8cHj;@;x~lb?)k-)CgEhuU-Uubdys9(u&{)H0W4j~qfS zb6&Z&aY2=6**BKXzY~od)NE|Oewntc)h}vy!kY%?p!I^=(sujb{1@x6toHn~`17-h zcLgrpsM=Us5$FC(Z^w);{H<>nJ?$|IejM(7WNv%m?Z_*8PKjFmvM^S87r}VB`{Kck z+iDG}zMTwiy0akd){~2YKcqwWuc`p7Ez0%73uk<+L%Q*CK%#3k=ki?>0VYJ?Q$Qlhv0aQikp7p&z`*1$id? z<#!6*;y>|_|-qpf3+eA4`vrqUM8kDb&j(+{Ri8D#) zW2HCt}ErY`cWxQLL^)Pkm+KN>1BTN=zXa$Z=xzvLXqzJj-Y z5m%?p6`7AM^0r#iT=5f~4%zt!ez1#I6D`dT6Zj-LGR+qGNVOpn-1-g)%mhOV}{u8V6lkJ zYm~F}*cV1PD@>_<`Gv{A@?Sd>%K~oG^sckokvC^JYQ5-NoF=*bE6dZl-M4gvYD5#{ zf-7%NKlMy=HMi?=<1_2ZIa4|B8%^w;(eO~ey*TP!#ct+>sjOcs8#W2OtvDvkX=@?s z5`NoywWPoghvr~yw`H9@(mEY)c1N&kE2s6ujc55UGP<$+UyoywR4>rbMjN(&v#VBDdU+2^Lny$NZqxgH0X2**pLGwkemc)7(VtgGSHwId9jbfoDQuPP zXAWbSwe97urYkdrm-kaA7Zml$i8v(0Rtc;M3CQBg z(hqm?j%qP#`?qyl@%~vK^Hg%qTh%W0$cxXK8>ai>>2CKo`fuMe1wGuNekF0s`HR_3 z59AUhn&vFI{FKHd7hQ&@1>HU}Qt1Z6ey&}FQ`IX+!kgM@}9R)!d+nY}A zKlmj$mSxgy<-4BKR#ax)OOks0Sh1k@#ETyR)vZ$;UtQGg%5c$ZUTfP_m+RcQX6}m0 zoJmJ}pCl@2*iP7H*Wy35guPX3kCn_i_Z$2cS0nG7uUNX}4D*Uy$LW7W^}8RXDstZ3 z5X`vnadU#B1%IjHnlEd1@cikBXkB%nzV=Yz_W2@LFWiXaUEuY$iK{i{ZKk-x{5?|- zFaGrS@0QCG9wwc4oPAPa?ffHCAD7f0QDg0DIUwcW5Ey(~>%#O;_ujp8itE^DHF@Q7 zlO9370vY}HYfaxx=RI?pjlo^zSJ=eK>5j}w9RhI=x!j6(9eApEpL@@xe+nM<7nNg! zBvRg9F8l3rP~~!X^X*+(hdzb}e?D{e{2@ix2M$3ZD@p=!`xy7B zRJn^ytexah*{HOm-pw?9>+k+4_oi=A`5zr0vQ{QrllAWsm+$M#AHHrsI6LM!_s4%u zf3|xsvSAQr(^hyOV2~neAmwl2Rs8F5$ky6Tj==#}K7aV!`}XlU+56s7r?S=6x;JdQ z{pd${MyvJ~tp~n_9}eGP^yqnSt#F3@!u#KTtX|gKlU`;_+hM&>?bt$H2gAOGSv=mJ zvlFZt?-@FuRLXTY)Tu@v8uz7dd=D^>-iZokhNpOZKec$y# z{kwP(Gf%McWcGgt7(cVJwC^anX3(j{K7GZCr2T$@lc%Yj)s^hzTv6>j^+=X?SIDVL zlh`isJNs^Uc>A=2UrqOdz4I+^smfnTzk8e0hvRiUtZ;Oib2CoU8zUQ1$;>+LtGUK|s;=((&H8C~+-y{jzEwNiD ztC7vey=$2+#~Z<|qD|j?58JSOwo6#HM!wy^MKEDwIFs-D13Fvle%`WXn(28(WYgj= z(`v19uWY_|#{12@+MD)jQMXplU2*NS(*#{#*=Os$4Mabbn^#5Y|NNxboV)T1OI@$( z#x6c(i5F|XtL+aws58;)i=2|lrn0Slo>gVH3Qw)bF|G2;X*SC}9(+`#^ZbODn|cJ7!{8Ct7qJDomrgMPh986d%{rD|KRG+aohWs+a8@+ z$f_{);@Zm{v%Uq*ELJUPGYoZ}s2gh;V2fj$=s#_9$ycsDb=l<+BLJ~%Hp|xtIEt3?<#ib&1TtmzQ{`UXKrbKSy|6} zy%kOjQ?J<1y;Whgb#d%`uR_H&E=v1)KYpHEcW3?X^)lD~zP~G`@bk;0+0u74u06_p z#`Nt+<)Xf#>ui=HzmI>k*iy(CwKnf_!i)=>7XRDNTXJfm(nquB*?&ql-OY79ew)YQ z>HL$=|6acH`Fyc?z5UOBdnU&(7mU6C_GtOH`?}e6rf)wbv`C-7yLx?L-PuibXD6+3 z(&yiL>j)J0zw+XpY6iPoq8mOpuC3+vS4|0!ajPku|wmagE}TWcLE<(GWp6!%9FlP$_g zPP0PvPfUms5xo6iQq)w&YOOn49Ne!?3GBDJVaoJ<_wJA9rW`cm@xFOgPT2JE-CNPG zVviqY++JCpc{zRhH=}9uwite7{;0ZjL5gPf`xCCY-fQn{XuXladwSvZ00EH)K2v|~ zd+IH9eOvGfi)F8up0W~g@G)~1eo*MYc+aznC^Z>hHbMSxp{7<7**1&)NXTU6@w)Zo z)RCrJ*J7>O79|{1e%n)+ZO`0wvRV1)pWEes9V{Xer!AK?soWNxkfOvuYB_Ng#wAr>qB2|HQIa2b#JTsf;O*z-aH2ch|p+1D0DkO&Nb)3;Y&tId$E4b(=No^xrQqb=J33@GNfPP<%RBKrck}r&X4h z*y*%nO_N)P))(w8`ewa1OuF21)>-anOAQoNQcEt#L^UPkPh37}T1fb(=bqObW^Rh} z4B$V`7kGDF2mk)P7bZA{JjoPq|2*}No6emj5x?K8|5+11S@UCU{_~yd-!gnjI{IS$ z%DLVtDetlvTjzc1GT_wu5ahhsV}iQz!w=CL(ro#yV`rD$Z&ngLG@Hx4N}2OY%-ZO` z?>~oKIeLw8@rsKbP8xI1uXa!N*?LW3@{?zg%y4r8fJGyu_)VZ|8YZP1e>YX%vV5n9rYTcdV-2>wUo2 z^=+$OMeBGj zznb22YhUYs6B2oQVbRxU=ilLXSu_}#;)9DLWPEt zV?}qz3p#Kleo2f-n`Wr)=~>aYzWT?HD)GmW_n!ZgQ8Z0AJfJRg-std_PVXrzQ*mYqw~&2NY~jz|;)N%f&iBlCdBvu%B|@iU!=;03GO~^Y9|;V-tQmh| z$C{#hkJe0Gy{6Rv-=PG*_{e8gXBAa8bf|g=EL_kfbZUd(;!yRYPF>#~%l$jJEM954 z(>fsuOR<1Pww*88|2N;i8};)fr@5vC`>r^d=gBND?y*Xl9{*`qHs=`UgL<}gU$*TJ zVo$U4T)%be3qgTLlt{ zslajj&((8^^Y82O#|rdl9BfiCbz7{*^OrqlvVi%KrQYH>HxrzaVjN<2BsFs1+&N)I zj>jw$mrgYmhg>Z&E~bSUI@`Y#*6o)RUv4}7P^j>AzoN;r?x+?Ow3K6Cc$-@WF)r4P(BPS@yS5=<;9nX*V@n~aa<#2}^zKR!NY z5J^24lFn7v^88-yyk=+N9j3?2#n0Ju&zLnUsj_nB#fyR4H*C1jWmvU2&%*NgidD7R z+S=PgMJN7RRowUcyZnUWY1*5^-#&aLU-S8Bc!$NAEo^fvK5FhR&sSEh-KcXq-Dh zxik88{@#yjY!(Wug_4h)F)%*DnbmdS?EYD1zcUSuFIKg0x#yeu;{E&Q=k8k1`Ta}A znVETp)GDq=uQXf@)|6!>L^aPTo+0%t>-nlvGjfzGkL&Nho567I%AJJ&3Xj+K2zNQe z$IBbKY2zEaaGGq zp_&YtXLFC8ezrbA^+5eixnF67@Gac+1c9 z=jV?6s&egVlt>mWVbOu>%g(-c#0Y3gz};c`j>Laca|&t674{D#tpC z<=)#Gie*+*Jee7HwWI3(zUDi7DywVj>f-i(_iH&;d8%`Y@Y+RxLk>^xHH*8;>nIm` zHTKq9*}aU~+S+e!7;ZDMw*G$a>udY>H*W|p5EIRLQtj<-I$`Ug4*RL8e`2p%6h4Z` zKXBrN!Rpo8ryoC7el9NN6Ea&Fjh|ohHK6K2r{oUy2S9j*Y1Bdq$C6kw|((04@ zJAs)!PC=DF#Ae~@dCRyIU99G&p4xPFW3qhiOvSy&SDmPr|6u#>AL~Bu2Y&xQewqL( O7(8A5T-G@yGywqXnfL1e literal 0 HcmV?d00001 diff --git a/icons/wifi.png b/icons/wifi.png new file mode 100644 index 0000000000000000000000000000000000000000..84e46eb5bb60cbc753af6274c1e3f9ae9b621ab3 GIT binary patch literal 11628 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 literal 0 HcmV?d00001 diff --git a/include/README b/include/README new file mode 100644 index 0000000..194dcd4 --- /dev/null +++ b/include/README @@ -0,0 +1,39 @@ + +This directory is intended for project header files. + +A header file is a file containing C declarations and macro definitions +to be shared between several project source files. You request the use of a +header file in your project source file (C, C++, etc) located in `src` folder +by including it, with the C preprocessing directive `#include'. + +```src/main.c + +#include "header.h" + +int main (void) +{ + ... +} +``` + +Including a header file produces the same results as copying the header file +into each source file that needs it. Such copying would be time-consuming +and error-prone. With a header file, the related declarations appear +in only one place. If they need to be changed, they can be changed in one +place, and programs that include the header file will automatically use the +new version when next recompiled. The header file eliminates the labor of +finding and changing all the copies as well as the risk that a failure to +find one copy will result in inconsistencies within a program. + +In C, the usual convention is to give header files names that end with `.h'. +It is most portable to use only letters, digits, dashes, and underscores in +header file names, and at most one dot. + +Read more about using header files in official GCC documentation: + +* Include Syntax +* Include Operation +* Once-Only Headers +* Computed Includes + +https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html diff --git a/platformio.ini b/platformio.ini new file mode 100644 index 0000000..15f1143 --- /dev/null +++ b/platformio.ini @@ -0,0 +1,160 @@ +;PlatformIO Project Configuration File +; +; Build options: build flags, source filter +; Upload options: custom upload port, speed and extra flags +; Library options: dependencies, extra library storages +; Advanced options: extra scripting +; +; Please visit documentation for the other options and examples +; https://docs.platformio.org/page/projectconf.html + +[env:bobbycar_usb] +platform = espressif32 +board = esp32dev +framework = arduino +board_build.partitions = bobbycar.csv + +upload_speed = 921600 +upload_port = /dev/ttyUSB* + +lib_deps = + TFT_eSPI + https://github.com/Ferdi265/cxx-ring-buffer + +lib_compat_mode = strict +build_unflags = + -std=gnu++11 + -Os + +build_flags = + -std=gnu++17 + -O3 + -DUSER_SETUP_LOADED=1 + -DILI9341_DRIVER=1 + -DTFT_MOSI=13 + -DTFT_SCLK=15 + -DTFT_CS=14 + -DTFT_DC=12 + -DTFT_RST=2 + -DLOAD_GLCD=1 + -DLOAD_FONT2=1 + -DLOAD_FONT4=1 + -DLOAD_FONT7=1 + -DSPI_FREQUENCY=27000000 + -DSPI_READ_FREQUENCY=20000000 + -DSPI_TOUCH_FREQUENCY=2500000 + -DPINS_RX1=4 + -DPINS_TX1=5 + -DPINS_RX2=25 + -DPINS_TX2=26 + -DPINS_GAS=35 + -DPINS_BREMS=33 + -DFEATURE_3WIRESW + -DPINS_3WIRESW_OUT=0 + -DPINS_3WIRESW_IN1=16 + -DPINS_3WIRESW_IN2=27 +; -DFEATURE_ROTARY +; -DPINS_ROTARY_CLK=16 +; -DPINS_ROTARY_DT=27 +; -DPINS_ROTARY_SW=0 + +[env:bobbycar_ota] +platform = espressif32 +board = esp32dev +framework = arduino +board_build.partitions = bobbycar.csv + +upload_protocol = espota +upload_port = 192.168.127.171 + +lib_deps = + TFT_eSPI + https://github.com/Ferdi265/cxx-ring-buffer + +lib_compat_mode = strict +build_unflags = + -std=gnu++11 + -Os + +build_flags = + -std=gnu++17 + -O3 + -DUSER_SETUP_LOADED=1 + -DILI9341_DRIVER=1 + -DTFT_MOSI=13 + -DTFT_SCLK=15 + -DTFT_CS=14 + -DTFT_DC=12 + -DTFT_RST=2 + -DLOAD_GLCD=1 + -DLOAD_FONT2=1 + -DLOAD_FONT4=1 + -DLOAD_FONT7=1 + -DSPI_FREQUENCY=27000000 + -DSPI_READ_FREQUENCY=20000000 + -DSPI_TOUCH_FREQUENCY=2500000 + -DPINS_RX1=4 + -DPINS_TX1=5 + -DPINS_RX2=25 + -DPINS_TX2=26 + -DPINS_GAS=35 + -DPINS_BREMS=33 + -DFEATURE_3WIRESW + -DPINS_3WIRESW_OUT=0 + -DPINS_3WIRESW_IN1=16 + -DPINS_3WIRESW_IN2=27 +; -DFEATURE_ROTARY +; -DPINS_ROTARY_CLK=16 +; -DPINS_ROTARY_DT=27 +; -DPINS_ROTARY_SW=0 + +[env:testbench] +platform = espressif32 +board = esp32dev +framework = arduino + +board_build.partitions = bobbycar.csv + +upload_port = /dev/ttyUSB* +upload_speed = 921600 + +lib_deps = + TFT_eSPI + https://github.com/Ferdi265/cxx-ring-buffer + +lib_compat_mode = strict +build_unflags = + -std=gnu++11 + -Os + +build_flags = + -std=gnu++17 + -O3 + -DUSER_SETUP_LOADED=1 + -DILI9341_DRIVER=1 + -DTFT_MOSI=22 + -DTFT_SCLK=21 + -DTFT_CS=27 + -DTFT_DC=32 + -DTFT_RST=25 + -DLOAD_GLCD=1 + -DLOAD_FONT2=1 + -DLOAD_FONT4=1 + -DLOAD_FONT7=1 + -DSPI_FREQUENCY=27000000 + -DSPI_READ_FREQUENCY=20000000 + -DSPI_TOUCH_FREQUENCY=2500000 + -DPINS_RX1=18 + -DPINS_TX1=19 + -DPINS_RX2=23 + -DPINS_TX2=34 + -DPINS_GAS=35 + -DPINS_BREMS=33 +; -DFEATURE_3WIRESW +; -DPINS_3WIRESW_OUT=17 +; -DPINS_3WIRESW_IN1=4 +; -DPINS_3WIRESW_IN2=16 +; -DFEATURE_ROTARY +; -DPINS_ROTARY_CLK=4 +; -DPINS_ROTARY_DT=16 +; -DPINS_ROTARY_SW=17 diff --git a/src/accessorinterface.h b/src/accessorinterface.h new file mode 100644 index 0000000..93351a1 --- /dev/null +++ b/src/accessorinterface.h @@ -0,0 +1,21 @@ +#pragma once + +namespace { +template +struct AccessorInterface +{ + virtual T getValue() const = 0; + virtual void setValue(T value) = 0; +}; + +//! A special type of AccessorInterface that allows for simple variable read/write operations +//! Can be used to read and write global settings for example. +template +struct RefAccessor : public virtual AccessorInterface +{ + virtual T& getRef() const = 0; + + T getValue() const override { return getRef(); }; + void setValue(T value) override { getRef() = value; }; +}; +} diff --git a/src/actioninterface.h b/src/actioninterface.h new file mode 100644 index 0000000..8340088 --- /dev/null +++ b/src/actioninterface.h @@ -0,0 +1,11 @@ +#pragma once + +#include "utils.h" + +namespace { +class ActionInterface +{ +public: + virtual void triggered() = 0; +}; +} diff --git a/src/actions/bluetoothbeginaction.h b/src/actions/bluetoothbeginaction.h new file mode 100644 index 0000000..c73a562 --- /dev/null +++ b/src/actions/bluetoothbeginaction.h @@ -0,0 +1,21 @@ +#pragma once + +#include + +#include "actioninterface.h" +#include "globals.h" + +namespace { +class BluetoothBeginAction : public virtual ActionInterface +{ +public: + void triggered() override + { + if (!bluetoothSerial.begin("bobbyquad")) + { + Serial.println("Could not begin bluetooth"); + // TODO: better error handling + } + } +}; +} diff --git a/src/actions/bluetoothbeginmasteraction.h b/src/actions/bluetoothbeginmasteraction.h new file mode 100644 index 0000000..d4b4253 --- /dev/null +++ b/src/actions/bluetoothbeginmasteraction.h @@ -0,0 +1,21 @@ +#pragma once + +#include + +#include "actioninterface.h" +#include "globals.h" + +namespace { +class BluetoothBeginMasterAction : public virtual ActionInterface +{ +public: + void triggered() override + { + if (!bluetoothSerial.begin("bobbyquad", true)) + { + Serial.println("Could not begin bluetooth master"); + // TODO: better error handling + } + } +}; +} diff --git a/src/actions/bluetoothconnectbmsaction.h b/src/actions/bluetoothconnectbmsaction.h new file mode 100644 index 0000000..f000fa8 --- /dev/null +++ b/src/actions/bluetoothconnectbmsaction.h @@ -0,0 +1,22 @@ +#pragma once + +#include + +#include "actioninterface.h" +#include "globals.h" + +namespace { +class BluetoothConnectBmsAction : public virtual ActionInterface +{ +public: + void triggered() override + { + uint8_t remoteAddress[ESP_BD_ADDR_LEN] = {0xAA, 0xBB, 0xCC, 0xA1, 0x23, 0x45}; + if (!bluetoothSerial.connect(remoteAddress)) + { + Serial.println("Could not connect bluetooth to bms"); + // TODO: better error handling + } + } +}; +} diff --git a/src/actions/bluetoothdisconnectaction.h b/src/actions/bluetoothdisconnectaction.h new file mode 100644 index 0000000..0e1be5f --- /dev/null +++ b/src/actions/bluetoothdisconnectaction.h @@ -0,0 +1,21 @@ +#pragma once + +#include + +#include "actioninterface.h" +#include "globals.h" + +namespace { +class BluetoothDisconnectAction : public virtual ActionInterface +{ +public: + void triggered() override + { + if (!bluetoothSerial.disconnect()) + { + Serial.println("Could not disconnect bluetooth"); + // TODO: better error handling + } + } +}; +} diff --git a/src/actions/bluetoothendaction.h b/src/actions/bluetoothendaction.h new file mode 100644 index 0000000..ea86126 --- /dev/null +++ b/src/actions/bluetoothendaction.h @@ -0,0 +1,15 @@ +#pragma once + +#include "actioninterface.h" +#include "globals.h" + +namespace { +class BluetoothEndAction : public virtual ActionInterface +{ +public: + void triggered() override + { + bluetoothSerial.end(); + } +}; +} diff --git a/src/actions/bluetoothflushaction.h b/src/actions/bluetoothflushaction.h new file mode 100644 index 0000000..cf7a342 --- /dev/null +++ b/src/actions/bluetoothflushaction.h @@ -0,0 +1,15 @@ +#pragma once + +#include "actioninterface.h" +#include "globals.h" + +namespace { +class BluetoothFlushAction : public virtual ActionInterface +{ +public: + void triggered() override + { + bluetoothSerial.flush(); + } +}; +} diff --git a/src/actions/bmsturnoffchargeaction.h b/src/actions/bmsturnoffchargeaction.h new file mode 100644 index 0000000..5a828c0 --- /dev/null +++ b/src/actions/bmsturnoffchargeaction.h @@ -0,0 +1,19 @@ +#pragma once + +#include "actioninterface.h" +#include "bmsutils.h" + +namespace { +class BmsTurnOffChargeAction : public virtual ActionInterface +{ +public: + void triggered() override + { + if (!bms::send6Bit(42405, 250, 0)) + { + Serial.println("Could not turn off charge mosfet"); + // TODO: better error handling + } + } +}; +} diff --git a/src/actions/bmsturnoffdischargeaction.h b/src/actions/bmsturnoffdischargeaction.h new file mode 100644 index 0000000..1231511 --- /dev/null +++ b/src/actions/bmsturnoffdischargeaction.h @@ -0,0 +1,19 @@ +#pragma once + +#include "actioninterface.h" +#include "bmsutils.h" + +namespace { +class BmsTurnOffDischargeAction : public virtual ActionInterface +{ +public: + void triggered() override + { + if (!bms::send6Bit(42405, 249, 0)) + { + Serial.println("Could not turn off discharge mosfet"); + // TODO: better error handling + } + } +}; +} diff --git a/src/actions/bmsturnonchargeaction.h b/src/actions/bmsturnonchargeaction.h new file mode 100644 index 0000000..a66f6ca --- /dev/null +++ b/src/actions/bmsturnonchargeaction.h @@ -0,0 +1,19 @@ +#pragma once + +#include "actioninterface.h" +#include "bmsutils.h" + +namespace { +class BmsTurnOnChargeAction : public virtual ActionInterface +{ +public: + void triggered() override + { + if (!bms::send6Bit(42405, 250, 1)) + { + Serial.println("Could not turn on charge mosfet"); + // TODO: better error handling + } + } +}; +} diff --git a/src/actions/bmsturnondischargeaction.h b/src/actions/bmsturnondischargeaction.h new file mode 100644 index 0000000..b8ec469 --- /dev/null +++ b/src/actions/bmsturnondischargeaction.h @@ -0,0 +1,19 @@ +#pragma once + +#include "actioninterface.h" +#include "bmsutils.h" + +namespace { +class BmsTurnOnDischargeAction : public virtual ActionInterface +{ +public: + void triggered() override + { + if (!bms::send6Bit(42405, 249, 1)) + { + Serial.println("Could not turn on discharge mosfet"); + // TODO: better error handling + } + } +}; +} diff --git a/src/actions/dummyaction.h b/src/actions/dummyaction.h new file mode 100644 index 0000000..cc300ac --- /dev/null +++ b/src/actions/dummyaction.h @@ -0,0 +1,11 @@ +#pragma once + +#include "actioninterface.h" + +namespace { +class DummyAction : public virtual ActionInterface +{ +public: + void triggered() override {} +}; +} diff --git a/src/actions/loadsettingsaction.h b/src/actions/loadsettingsaction.h new file mode 100644 index 0000000..3bdb1b3 --- /dev/null +++ b/src/actions/loadsettingsaction.h @@ -0,0 +1,12 @@ +#pragma once + +#include "actioninterface.h" +#include "utils.h" + +namespace { +class LoadSettingsAction : public virtual ActionInterface +{ +public: + void triggered() override { loadSettings(); } +}; +} diff --git a/src/actions/multiaction.h b/src/actions/multiaction.h new file mode 100644 index 0000000..3ab4d48 --- /dev/null +++ b/src/actions/multiaction.h @@ -0,0 +1,35 @@ +#pragma once + +#include "actioninterface.h" + +namespace { +template +class MultiAction; + +template +class MultiAction : public virtual ActionInterface +{ +public: + void triggered() override + { + m_action.triggered(); + } + +private: + T m_action; +}; + +template +class MultiAction : public virtual MultiAction +{ +public: + void triggered() override + { + m_action.triggered(); + MultiAction::triggered(); + } + +private: + T m_action; +}; +} diff --git a/src/actions/rebootaction.h b/src/actions/rebootaction.h new file mode 100644 index 0000000..4fb6773 --- /dev/null +++ b/src/actions/rebootaction.h @@ -0,0 +1,28 @@ +#pragma once + +#include + +#include "actioninterface.h" +#include "globals.h" +#include "texts.h" + +namespace { +class RebootAction : public virtual ActionInterface +{ +public: + void triggered() override + { + tft.fillScreen(TFT_BLACK); + tft.setTextColor(TFT_YELLOW); + + tft.drawString(TEXT_REBOOT, 5, 5, 4); + + tft.fillRect(0, 34, tft.width(), 3, TFT_WHITE); + + tft.setTextColor(TFT_WHITE); + tft.drawString("Rebooting now...", 0, 50, 4); + + ESP.restart(); + } +}; +} diff --git a/src/actions/savesettingsaction.h b/src/actions/savesettingsaction.h new file mode 100644 index 0000000..e02ea47 --- /dev/null +++ b/src/actions/savesettingsaction.h @@ -0,0 +1,12 @@ +#pragma once + +#include "actioninterface.h" +#include "utils.h" + +namespace { +class SaveSettingsAction : public virtual ActionInterface +{ +public: + void triggered() override { saveSettings(); } +}; +} diff --git a/src/actions/switchscreenaction.h b/src/actions/switchscreenaction.h new file mode 100644 index 0000000..3a68137 --- /dev/null +++ b/src/actions/switchscreenaction.h @@ -0,0 +1,13 @@ +#pragma once + +#include "actioninterface.h" +#include "utils.h" + +namespace { +template +class SwitchScreenAction : public virtual ActionInterface +{ +public: + void triggered() override { switchScreen(std::make_unique()...); } +}; +} diff --git a/src/actions/toggleboolaction.h b/src/actions/toggleboolaction.h new file mode 100644 index 0000000..700b714 --- /dev/null +++ b/src/actions/toggleboolaction.h @@ -0,0 +1,15 @@ +#pragma once + +#include "actioninterface.h" +#include "accessorinterface.h" + +namespace { +class ToggleBoolAction : public virtual ActionInterface, public virtual AccessorInterface +{ +public: + void triggered() override + { + setValue(!getValue()); + } +}; +} diff --git a/src/actions/updateswapfrontbackaction.h b/src/actions/updateswapfrontbackaction.h new file mode 100644 index 0000000..ac51e1a --- /dev/null +++ b/src/actions/updateswapfrontbackaction.h @@ -0,0 +1,12 @@ +#pragma once + +#include "actioninterface.h" +#include "utils.h" + +namespace { +class UpdateSwapFrontBackAction : public virtual ActionInterface +{ +public: + void triggered() override { updateSwapFrontBack(); } +}; +} diff --git a/src/actions/wifidisconnectaction.h b/src/actions/wifidisconnectaction.h new file mode 100644 index 0000000..9a3fad3 --- /dev/null +++ b/src/actions/wifidisconnectaction.h @@ -0,0 +1,21 @@ +#pragma once + +#include +#include + +#include "actioninterface.h" + +namespace { +class WifiDisconnectAction : public virtual ActionInterface +{ +public: + void triggered() override + { + if (!WiFi.disconnect()) + { + Serial.println("Could not disconnect WiFi"); + // TODO: better error handling + } + } +}; +} diff --git a/src/actions/wifienableipv6action.h b/src/actions/wifienableipv6action.h new file mode 100644 index 0000000..4e54061 --- /dev/null +++ b/src/actions/wifienableipv6action.h @@ -0,0 +1,21 @@ +#pragma once + +#include +#include + +#include "actioninterface.h" + +namespace { +class WifiEnableIpV6Action : public virtual ActionInterface +{ +public: + void triggered() override + { + if (!WiFi.enableIpV6()) + { + Serial.println("Could not enableIpV6 WiFi"); + // TODO: better error handling + } + } +}; +} diff --git a/src/actions/wifireconnectaction.h b/src/actions/wifireconnectaction.h new file mode 100644 index 0000000..d4bc7c7 --- /dev/null +++ b/src/actions/wifireconnectaction.h @@ -0,0 +1,21 @@ +#pragma once + +#include +#include + +#include "actioninterface.h" + +namespace { +class WifiReconnectAction : public virtual ActionInterface +{ +public: + void triggered() override + { + if (!WiFi.reconnect()) + { + Serial.println("Could not reconnect WiFi"); + // TODO: better error handling + } + } +}; +} diff --git a/src/actions/wifisoftapenableipv6action.h b/src/actions/wifisoftapenableipv6action.h new file mode 100644 index 0000000..1d35b86 --- /dev/null +++ b/src/actions/wifisoftapenableipv6action.h @@ -0,0 +1,21 @@ +#pragma once + +#include +#include + +#include "actioninterface.h" + +namespace { +class WifiSoftApEnableIpV6Action : public virtual ActionInterface +{ +public: + void triggered() override + { + if (!WiFi.softAPenableIpV6()) + { + Serial.println("Could not softAPenableIpV6 WiFi"); + // TODO: better error handling + } + } +}; +} diff --git a/src/bluetoothtexthelpers.h b/src/bluetoothtexthelpers.h new file mode 100644 index 0000000..340cde7 --- /dev/null +++ b/src/bluetoothtexthelpers.h @@ -0,0 +1,37 @@ +#pragma once + +#include "textinterface.h" +#include "globals.h" +#include "utils.h" + +namespace { +template +using BluetoothStatusTextHelper = StatusTextHelper; + +constexpr char TEXT_BLUETOOTHAVAILABLE[] = "Available: "; +using BluetoothAvailableText = BluetoothStatusTextHelper; + +constexpr char TEXT_BLUETOOTHHASCLIENT[] = "Has client: "; +using BluetoothHasClientText = BluetoothStatusTextHelper; + +//constexpr char TEXT_BLUETOOTHCONNECTED[] = "Connected: "; +//using BluetoothConnectedText = BluetoothStatusTextHelper; +struct BluetoothConnectedText : public virtual TextInterface { +public: + String text() const override { return String{"connected: "} + toString(bluetoothSerial.connected()); } +}; + +//constexpr char TEXT_BLUETOOTHISREADY[] = "Is ready: "; +//using BluetoothIsReadyText = BluetoothStatusTextHelper; +struct BluetoothIsReadyText : public virtual TextInterface { +public: + String text() const override { return String{"isReady: "} + toString(bluetoothSerial.isReady()); } +}; + +//constexpr char TEXT_BLUETOOTHISREADYMASTER[] = "Is ready (M): "; +//using BluetoothIsReadyMasterText = BluetoothStatusTextHelper; +class BluetoothIsReadyMasterText : public virtual TextInterface { +public: + String text() const override { return String{"isReady (M): "} + toString(bluetoothSerial.isReady(true)); } +}; +} diff --git a/src/bmsutils.h b/src/bmsutils.h new file mode 100644 index 0000000..b4a528f --- /dev/null +++ b/src/bmsutils.h @@ -0,0 +1,122 @@ +#pragma once + +#include "globals.h" + +namespace { +namespace bms { +constexpr auto autoReconnect = false; // causes hangs when not available + +bool lastConnected; +unsigned long lastSend; +unsigned long lastReceive; + +float voltage; +float current; +float capacity; +int8_t soc; +float cycle; +int16_t power; +float batt[12]; + +bool send6Bit(int zhen_tou, int address, int data) +{ + uint8_t buffer[6]; + buffer[0] = (char)((zhen_tou>>8)&255); + buffer[1] = (char)(zhen_tou&255); + buffer[2] = (char)(address&255); + buffer[3] = (char)((data>>8)&255); + buffer[4] = (char)(data&255); + buffer[5] = (char)(buffer[2]+buffer[3]+buffer[4]); + + const auto sent = bluetoothSerial.write(buffer, 6); + if (sent != 6) + Serial.printf("send: %lu\r\n", sent); + return sent == 6; +} + +void update() +{ + const auto now = millis(); + + if (bluetoothSerial.hasClient() != lastConnected) + { + lastSend = 0; + lastConnected = bluetoothSerial.hasClient(); + } + + if (bluetoothSerial.hasClient()) + { + if (bluetoothSerial.available() >= 140) + { + uint8_t buffer[140]; + const auto read = bluetoothSerial.readBytes(buffer, 140); + if (read != 140) + { + Serial.printf("bms read buffer too short %lu\r\n", read); + + for (int i = 0; i < read; i++) + Serial.printf("%i ", buffer[i]); + Serial.println(); + + goto after_read; + } + + if (buffer[0] != 170 || + buffer[1] != 85 || + buffer[2] != 170 || + buffer[3] != 255) + { + Serial.println("bms read buffer wrong sequence"); + + for (const auto &x : buffer) + Serial.printf("%i ", x); + Serial.println(); + + goto after_read; + } + + lastReceive = now; + + voltage = static_cast((buffer[4] << 8) | buffer[5]) / 10.f; + current = static_cast((buffer[72] << 8) | buffer[73]) / 10.f; + capacity = static_cast((((((buffer[79] << 8) | buffer[80]) << 8) | buffer[81]) << 8) | buffer[82]) / 1000.f; + soc = buffer[74]; + cycle = static_cast((((((buffer[83] << 8) | buffer[84]) << 8) | buffer[85]) << 8) | buffer[86]) / 1000.f; + power = (buffer[113] << 8) | buffer[114]; + + for (int i = 0; i < 12; i++) + batt[i] = ((buffer[(i*2)+6] * 256) + buffer[(i*2)+7]) / 1000.f; + } +// else if (bluetoothSerial.available()) +// { +// Serial.printf("available() = %i\r\n", bluetoothSerial.available()); +// while (bluetoothSerial.available()) +// Serial.printf("%i ", bluetoothSerial.read()); +// Serial.println(); +// } + + after_read: + + if (!lastSend || now-lastSend >= 1000) + { + Serial.println("requresting bms live values"); + if (!send6Bit(56283, 0, 0)) + Serial.println("could not request bms live values"); + lastSend = now; + } + } + else if (autoReconnect) + { + if (!lastSend || now-lastSend >= 500) + { + uint8_t remoteAddress[ESP_BD_ADDR_LEN] = {0xAA, 0xBB, 0xCC, 0xA1, 0x23, 0x45}; + Serial.println("connect()"); + const auto result = bluetoothSerial.connect(remoteAddress); + Serial.printf("connect() returned %s\r\n", result?"true":"false"); + + lastSend = now; + } + } +} +} +} diff --git a/src/bobbycar-protocol/protocol.h b/src/bobbycar-protocol/protocol.h new file mode 100644 index 0000000..35cde1e --- /dev/null +++ b/src/bobbycar-protocol/protocol.h @@ -0,0 +1,122 @@ +#pragma once + +#include + +namespace { + +enum class ControlType : uint8_t { + Commutation, + Sinusoidal, + FieldOrientedControl +}; + +enum class ControlMode : uint8_t { + OpenMode, + Voltage, + Speed, // Only with FieldOrientedControl + Torque // Only with FieldOrientedControl +}; + +struct MotorState { + bool enable = false; + int16_t pwm = 0; + ControlType ctrlTyp = ControlType::FieldOrientedControl; + ControlMode ctrlMod = ControlMode::OpenMode; + int16_t iMotMax = 15; // [A] Maximum motor current limit + int16_t iDcMax = 17; // [A] Maximum DC Link current limit (This is the final current protection. Above this value, current chopping is applied. To avoid this make sure that I_DC_MAX = I_MOT_MAX + 2A) + int16_t nMotMax = 1000; // [rpm] Maximum motor speed limit + int16_t fieldWeakMax = 10; // [A] Maximum Field Weakening D axis current (only for FOC). Higher current results in higher maximum speed. + int16_t phaseAdvMax = 40; // [deg] Maximum Phase Advance angle (only for SIN). Higher angle results in higher maximum speed. +}; + +uint16_t calculateChecksum(MotorState state) { + return + uint16_t(state.enable) ^ + state.pwm ^ + uint16_t(state.ctrlTyp) ^ + uint16_t(state.ctrlMod) ^ + state.iMotMax ^ + state.iDcMax ^ + state.nMotMax ^ + state.fieldWeakMax ^ + state.phaseAdvMax; +} + +struct BuzzerState { + uint8_t freq = 0; + uint8_t pattern = 0; +}; + +uint16_t calculateChecksum(BuzzerState state) { + return state.freq ^ state.pattern; +} + +struct Command { + static constexpr uint16_t VALID_HEADER = 0xAAAA; + static constexpr uint16_t INVALID_HEADER = 0xFFFF; + + uint16_t start; + + MotorState left, right; + + BuzzerState buzzer; + + bool poweroff = false; + bool led = false; + + uint16_t checksum; +}; + +uint16_t calculateChecksum(Command command) { + return command.start ^ + calculateChecksum(command.left) ^ + calculateChecksum(command.right) ^ + calculateChecksum(command.buzzer) ^ + command.poweroff ^ + command.led; +} + +struct MotorFeedback { + int16_t angle = 0; + int16_t speed = 0; + uint8_t error = 0; + int16_t current = 0; + uint32_t chops = 0; + bool hallA = false, + hallB = false, + hallC = false; +}; + +uint16_t calculateChecksum(MotorFeedback feedback) { + return feedback.angle ^ feedback.speed ^ + feedback.error ^ feedback.current ^ + feedback.chops ^ + feedback.hallA ^ feedback.hallB ^ feedback.hallC; +} + +struct Feedback { + static constexpr uint16_t VALID_HEADER = 0xAAAA; + static constexpr uint16_t INVALID_HEADER = 0xFFFF; + + uint16_t start; + + MotorFeedback left, right; + + int16_t batVoltage = 0; + int16_t boardTemp = 0; + + int16_t timeoutCntSerial = 0; + + uint16_t checksum; +}; + +uint16_t calculateChecksum(Feedback feedback) { + return feedback.start ^ + calculateChecksum(feedback.left) ^ + calculateChecksum(feedback.right) ^ + feedback.batVoltage ^ + feedback.boardTemp ^ + feedback.timeoutCntSerial; +} + +} diff --git a/src/changevaluedisplay.h b/src/changevaluedisplay.h new file mode 100644 index 0000000..484bd6f --- /dev/null +++ b/src/changevaluedisplay.h @@ -0,0 +1,150 @@ +#pragma once + +#include "display.h" +#include "textinterface.h" +#include "actioninterface.h" +#include "accessorinterface.h" +#include "widgets/label.h" +#include "globals.h" +#include "utils.h" + +namespace { +class ChangeValueDisplayInterface : public Display, public virtual TextInterface, public virtual ActionInterface +{ +public: + void initScreen() override; + + ChangeValueDisplayInterface *asChangeValueDisplayInterface() override { return this; } + const ChangeValueDisplayInterface *asChangeValueDisplayInterface() const override { return this; } + + virtual int shownValue() const = 0; + virtual void setShownValue(int value) = 0; + + virtual void confirm() = 0; + +protected: + Label m_titleLabel{5, 5}; // 230, 25 + Label m_valueLabel{26, 81}; // 188, 53 +}; + +template +class ChangeValueDisplaySettingsInterface +{ +public: + virtual Tvalue step() const { return 1; }; +}; + +template +class RatioNumberStep : public virtual ChangeValueDisplaySettingsInterface +{ +public: + Tvalue step() const override { return Tvalue(Tratio::num) / Tratio::den; } +}; + +template +class ChangeValueDisplay : public ChangeValueDisplayInterface, public virtual AccessorInterface, public virtual ChangeValueDisplaySettingsInterface +{ + using Base = ChangeValueDisplayInterface; + +public: + void start() override; + void update() override; + void redraw() override; + + void rotate(int offset) override; + void button() override; + + int shownValue() const { return m_value; } + void setShownValue(int value) { m_value = value; } + + void confirm() override; + +private: + Tvalue m_value{}; + + int m_rotateOffset; + bool m_pressed{}; +}; + +void ChangeValueDisplayInterface::initScreen() +{ + tft.fillScreen(TFT_BLACK); + + m_titleLabel.start(); + + tft.fillRect(0, 34, tft.width(), 3, TFT_WHITE); + + tft.drawRect(25, 75, 190, 65, TFT_WHITE); + m_valueLabel.start(); + + tft.setTextFont(4); + tft.setTextColor(TFT_WHITE); + tft.drawString("Change value and", 10, 160); + tft.drawString("press button to", 10, 185); + tft.drawString("confirm and go", 10, 210); + tft.drawString("back.", 10, 235); +} + +template +void ChangeValueDisplay::start() +{ + m_value = static_cast*>(this)->getValue(); + + m_rotateOffset = 0; + m_pressed = false; +} + +template +void ChangeValueDisplay::update() +{ + if (!m_pressed) + { + const auto rotateOffset = m_rotateOffset; + m_rotateOffset = 0; + + m_value -= rotateOffset * static_cast*>(this)->step(); + } + else + { + static_cast*>(this)->setValue(m_value); + triggered(); + } +} + +template +void ChangeValueDisplay::redraw() +{ + tft.setTextFont(4); + tft.setTextColor(TFT_YELLOW); + m_titleLabel.redraw(text()); + + tft.setTextColor(TFT_WHITE, TFT_BLACK); + tft.setTextFont(7); + m_valueLabel.redraw(String{m_value}); +} + +template +void ChangeValueDisplay::rotate(int offset) +{ + m_rotateOffset += offset; +} + +template +void ChangeValueDisplay::button() +{ + m_pressed = true; +} + +template +void ChangeValueDisplay::confirm() +{ + m_pressed = true; +} +} + +#include "changevaluedisplay_bool.h" +#include "changevaluedisplay_controlmode.h" +#include "changevaluedisplay_controltype.h" +#include "changevaluedisplay_larsmmode_mode.h" +#include "changevaluedisplay_wifi_mode_t.h" +#include "changevaluedisplay_wifi_power_t.h" diff --git a/src/changevaluedisplay_bool.h b/src/changevaluedisplay_bool.h new file mode 100644 index 0000000..9cf4ef7 --- /dev/null +++ b/src/changevaluedisplay_bool.h @@ -0,0 +1,52 @@ +#pragma once + +#include "changevaluedisplay.h" +#include "menudisplay.h" +#include "staticmenudefinition.h" +#include "actioninterface.h" +#include "utils.h" +#include "actions/dummyaction.h" +#include "icons/back.h" +#include "texts.h" + +namespace { +template<> +class ChangeValueDisplay : + public MenuDisplay, + public StaticMenuDefinition< + makeComponent, DummyAction>, + makeComponent, DummyAction>, + makeComponent, DummyAction, StaticMenuItemIcon<&icons::back>> + >, + public virtual AccessorInterface, + public virtual ActionInterface +{ + using Base = MenuDisplay; + +public: + void start() override; + + void itemPressed(int index) override; +}; + +void ChangeValueDisplay::start() +{ + Base::start(); + + if (getValue() == true) + setSelectedIndex(0); + else if (getValue() == false) + setSelectedIndex(1); +} + +void ChangeValueDisplay::itemPressed(int index) +{ + switch (index) + { + case 0: setValue(true); break; + case 1: setValue(false); break; + } + + triggered(); +} +} diff --git a/src/changevaluedisplay_controlmode.h b/src/changevaluedisplay_controlmode.h new file mode 100644 index 0000000..19668d9 --- /dev/null +++ b/src/changevaluedisplay_controlmode.h @@ -0,0 +1,64 @@ +#pragma once + +#include "changevaluedisplay.h" +#include "menudisplay.h" +#include "staticmenudefinition.h" +#include "utils.h" +#include "actions/dummyaction.h" +#include "icons/back.h" +#include "texts.h" + +namespace { +template<> +class ChangeValueDisplay : + public MenuDisplay, + public StaticMenuDefinition< + makeComponent, DummyAction>, + makeComponent, DummyAction>, + makeComponent, DummyAction>, + makeComponent, DummyAction>, + makeComponent, DummyAction, StaticMenuItemIcon<&icons::back>> + >, + public virtual AccessorInterface, + public virtual ActionInterface +{ + using Base = MenuDisplay; + +public: + void start() override; + + void itemPressed(int index) override; +}; + +void ChangeValueDisplay::start() +{ + Base::start(); + + if (getValue() == ControlMode::OpenMode) + setSelectedIndex(0); + else if (getValue() == ControlMode::Voltage) + setSelectedIndex(1); + else if (getValue() == ControlMode::Speed) + setSelectedIndex(2); + else if (getValue() == ControlMode::Torque) + setSelectedIndex(3); + else + { + Serial.printf("Unknown ControlMode: %i", int(getValue())); + setSelectedIndex(4); + } +} + +void ChangeValueDisplay::itemPressed(int index) +{ + switch (index) + { + case 0: setValue(ControlMode::OpenMode); break; + case 1: setValue(ControlMode::Voltage); break; + case 2: setValue(ControlMode::Speed); break; + case 3: setValue(ControlMode::Torque); break; + } + + triggered(); +} +} diff --git a/src/changevaluedisplay_controltype.h b/src/changevaluedisplay_controltype.h new file mode 100644 index 0000000..9050a8c --- /dev/null +++ b/src/changevaluedisplay_controltype.h @@ -0,0 +1,60 @@ +#pragma once + +#include "changevaluedisplay.h" +#include "menudisplay.h" +#include "staticmenudefinition.h" +#include "utils.h" +#include "actions/dummyaction.h" +#include "icons/back.h" +#include "texts.h" + +namespace { +template<> +class ChangeValueDisplay : + public MenuDisplay, + public StaticMenuDefinition< + makeComponent, DummyAction>, + makeComponent, DummyAction>, + makeComponent, DummyAction>, + makeComponent, DummyAction, StaticMenuItemIcon<&icons::back>> + >, + public virtual AccessorInterface, + public virtual ActionInterface +{ + using Base = MenuDisplay; + +public: + void start() override; + + void itemPressed(int index) override; +}; + +void ChangeValueDisplay::start() +{ + Base::start(); + + if (getValue() == ControlType::Commutation) + setSelectedIndex(0); + else if (getValue() == ControlType::Sinusoidal) + setSelectedIndex(1); + else if (getValue() == ControlType::FieldOrientedControl) + setSelectedIndex(2); + else + { + Serial.printf("Unknown ControlType: %i", int(getValue())); + setSelectedIndex(3); + } +} + +void ChangeValueDisplay::itemPressed(int index) +{ + switch (index) + { + case 0: setValue(ControlType::Commutation); break; + case 1: setValue(ControlType::Sinusoidal); break; + case 2: setValue(ControlType::FieldOrientedControl); break; + } + + triggered(); +} +} diff --git a/src/changevaluedisplay_larsmmode_mode.h b/src/changevaluedisplay_larsmmode_mode.h new file mode 100644 index 0000000..39504cf --- /dev/null +++ b/src/changevaluedisplay_larsmmode_mode.h @@ -0,0 +1,65 @@ +#pragma once + +#include "changevaluedisplay.h" +#include "menudisplay.h" +#include "staticmenudefinition.h" +#include "utils.h" +#include "actions/dummyaction.h" +#include "icons/back.h" +#include "texts.h" +#include "modes/larsmmode.h" + +namespace { +template<> +class ChangeValueDisplay : + public MenuDisplay, + public StaticMenuDefinition< + makeComponent, DummyAction>, + makeComponent, DummyAction>, + makeComponent, DummyAction>, + makeComponent, DummyAction>, + makeComponent, DummyAction, StaticMenuItemIcon<&icons::back>> + >, + public virtual AccessorInterface, + public virtual ActionInterface +{ + using Base = MenuDisplay; + +public: + void start() override; + + void itemPressed(int index) override; +}; + +void ChangeValueDisplay::start() +{ + Base::start(); + + if (getValue() == LarsmModeMode::Mode1) + setSelectedIndex(0); + else if (getValue() == LarsmModeMode::Mode2) + setSelectedIndex(1); + else if (getValue() == LarsmModeMode::Mode3) + setSelectedIndex(2); + else if (getValue() == LarsmModeMode::Mode4) + setSelectedIndex(3); + else + { + Serial.printf("Unknown LarsmModeMode: %i", int(getValue())); + setSelectedIndex(4); + } +} + +void ChangeValueDisplay::itemPressed(int index) +{ + switch (index) + { + case 0: setValue(LarsmModeMode::Mode1); break; + case 1: setValue(LarsmModeMode::Mode2); break; + case 2: setValue(LarsmModeMode::Mode3); break; + case 3: setValue(LarsmModeMode::Mode4); break; + } + + triggered(); +} +} diff --git a/src/changevaluedisplay_wifi_mode_t.h b/src/changevaluedisplay_wifi_mode_t.h new file mode 100644 index 0000000..67e2ca9 --- /dev/null +++ b/src/changevaluedisplay_wifi_mode_t.h @@ -0,0 +1,66 @@ +#pragma once + +#include + +#include "changevaluedisplay.h" +#include "menudisplay.h" +#include "staticmenudefinition.h" +#include "utils.h" +#include "actions/dummyaction.h" +#include "icons/back.h" +#include "texts.h" + +namespace { +template<> +class ChangeValueDisplay : + public MenuDisplay, + public StaticMenuDefinition< + makeComponent, DummyAction>, + makeComponent, DummyAction>, + makeComponent, DummyAction>, + makeComponent, DummyAction>, + makeComponent, DummyAction, StaticMenuItemIcon<&icons::back>> + >, + public virtual AccessorInterface, + public virtual ActionInterface +{ + using Base = MenuDisplay; + +public: + void start() override; + + void itemPressed(int index) override; +}; + +void ChangeValueDisplay::start() +{ + Base::start(); + + if (getValue() == WIFI_MODE_NULL) + setSelectedIndex(0); + else if (getValue() == WIFI_MODE_STA) + setSelectedIndex(1); + else if (getValue() == WIFI_MODE_AP) + setSelectedIndex(2); + else if (getValue() == WIFI_MODE_APSTA) + setSelectedIndex(3); + else + { + Serial.printf("Unknown wifi_mode_t: %i", int(getValue())); + setSelectedIndex(4); + } +} + +void ChangeValueDisplay::itemPressed(int index) +{ + switch (index) + { + case 0: setValue(WIFI_MODE_NULL); break; + case 1: setValue(WIFI_MODE_STA); break; + case 2: setValue(WIFI_MODE_AP); break; + case 3: setValue(WIFI_MODE_APSTA); break; + } + + triggered(); +} +} diff --git a/src/changevaluedisplay_wifi_power_t.h b/src/changevaluedisplay_wifi_power_t.h new file mode 100644 index 0000000..a902f54 --- /dev/null +++ b/src/changevaluedisplay_wifi_power_t.h @@ -0,0 +1,98 @@ +#pragma once + +#include + +#include "changevaluedisplay.h" +#include "menudisplay.h" +#include "staticmenudefinition.h" +#include "utils.h" +#include "actions/dummyaction.h" +#include "icons/back.h" +#include "texts.h" + +namespace { +template<> +class ChangeValueDisplay : + public MenuDisplay, + public StaticMenuDefinition< + makeComponent, DummyAction>, + makeComponent, DummyAction>, + makeComponent, DummyAction>, + makeComponent, DummyAction>, + makeComponent, DummyAction>, + makeComponent, DummyAction>, + makeComponent, DummyAction>, + makeComponent, DummyAction>, + makeComponent, DummyAction>, + makeComponent, DummyAction>, + makeComponent, DummyAction>, + makeComponent, DummyAction>, + makeComponent, DummyAction, StaticMenuItemIcon<&icons::back>> + >, + public virtual AccessorInterface, + public virtual ActionInterface +{ + using Base = MenuDisplay; + +public: + void start() override; + + void itemPressed(int index) override; +}; + +void ChangeValueDisplay::start() +{ + Base::start(); + + if (getValue() == WIFI_POWER_19_5dBm) + setSelectedIndex(0); + else if (getValue() == WIFI_POWER_19dBm) + setSelectedIndex(1); + else if (getValue() == WIFI_POWER_18_5dBm) + setSelectedIndex(2); + else if (getValue() == WIFI_POWER_17dBm) + setSelectedIndex(3); + else if (getValue() == WIFI_POWER_15dBm) + setSelectedIndex(4); + else if (getValue() == WIFI_POWER_13dBm) + setSelectedIndex(5); + else if (getValue() == WIFI_POWER_11dBm) + setSelectedIndex(6); + else if (getValue() == WIFI_POWER_8_5dBm) + setSelectedIndex(7); + else if (getValue() == WIFI_POWER_7dBm) + setSelectedIndex(8); + else if (getValue() == WIFI_POWER_5dBm) + setSelectedIndex(9); + else if (getValue() == WIFI_POWER_2dBm) + setSelectedIndex(10); + else if (getValue() == WIFI_POWER_MINUS_1dBm) + setSelectedIndex(11); + else + { + Serial.printf("Unknown wifi_power_t: %i", int(getValue())); + setSelectedIndex(12); + } +} + +void ChangeValueDisplay::itemPressed(int index) +{ + switch (index) + { + case 0: setValue(WIFI_POWER_19_5dBm); break; + case 1: setValue(WIFI_POWER_19dBm); break; + case 2: setValue(WIFI_POWER_18_5dBm); break; + case 3: setValue(WIFI_POWER_17dBm); break; + case 4: setValue(WIFI_POWER_15dBm); break; + case 5: setValue(WIFI_POWER_13dBm); break; + case 6: setValue(WIFI_POWER_11dBm); break; + case 7: setValue(WIFI_POWER_8_5dBm); break; + case 8: setValue(WIFI_POWER_7dBm); break; + case 9: setValue(WIFI_POWER_5dBm); break; + case 10: setValue(WIFI_POWER_2dBm); break; + case 11: setValue(WIFI_POWER_MINUS_1dBm); break; + } + + triggered(); +} +} diff --git a/src/checkboxicon.h b/src/checkboxicon.h new file mode 100644 index 0000000..f60ec49 --- /dev/null +++ b/src/checkboxicon.h @@ -0,0 +1,17 @@ +#pragma once + +#include "menuitem.h" +#include "accessorinterface.h" +#include "icons/checked.h" +#include "icons/unchecked.h" + +namespace { +class CheckboxIcon : public virtual MenuItemIconInterface, public virtual AccessorInterface +{ +public: + const MenuItemIcon *icon() const override + { + return getValue() ? &icons::checked : &icons::unchecked; + } +}; +} diff --git a/src/colorinterface.h b/src/colorinterface.h new file mode 100644 index 0000000..a1e5ad9 --- /dev/null +++ b/src/colorinterface.h @@ -0,0 +1,32 @@ +#pragma once + +#include "TFT_eSPI.h" + +namespace { +class ColorInterface { +public: + virtual int color() const { return TFT_WHITE; }; +}; + +template +class StaticColor : public virtual ColorInterface +{ +public: + static constexpr int STATIC_COLOR = TColor; + + int color() const override { return TColor; } +}; + +using DefaultColor = StaticColor; +using DisabledColor = StaticColor; + +class ChangeableColor : public virtual ColorInterface +{ +public: + int color() const override { return m_color; } + void setColor(const int &color) { m_color = color; } + +private: + int m_color; +}; +} diff --git a/src/controller.h b/src/controller.h new file mode 100644 index 0000000..bd6ad63 --- /dev/null +++ b/src/controller.h @@ -0,0 +1,28 @@ +#pragma once + +#include + +#include "bobbycar-protocol/protocol.h" + +#include "feedbackparser.h" + +class HardwareSerial; + +namespace { +struct Controller { + Controller(HardwareSerial &serial, bool &enableLeft, bool &enableRight, bool &invertLeft, bool &invertRight) : + serial{serial}, enableLeft{enableLeft}, enableRight{enableRight}, invertLeft{invertLeft}, invertRight{invertRight} + { + } + + std::reference_wrapper serial; + bool &enableLeft, &enableRight, &invertLeft, &invertRight; + + Command command{}; + + bool feedbackValid{}; + Feedback feedback{}; + + FeedbackParser parser{serial, feedbackValid, feedback}; +}; +} diff --git a/src/debugcolorhelpers.h b/src/debugcolorhelpers.h new file mode 100644 index 0000000..bb0ced0 --- /dev/null +++ b/src/debugcolorhelpers.h @@ -0,0 +1,15 @@ +#pragma once + +#include "colorinterface.h" +#include "globals.h" + +namespace { +template +class FeedbackColor : public virtual ColorInterface { public: int color() const { return Tcontroller.feedbackValid ? TsuccessColor : TFT_RED; } }; + +template +using FrontFeedbackColor = FeedbackColor; + +template +using BackFeedbackColor = FeedbackColor; +} diff --git a/src/debugtexthelpers.h b/src/debugtexthelpers.h new file mode 100644 index 0000000..28cf877 --- /dev/null +++ b/src/debugtexthelpers.h @@ -0,0 +1,90 @@ +#pragma once + +#include "textinterface.h" +#include "globals.h" +#include "utils.h" + +namespace { +template +struct ControllerTexts +{ + ControllerTexts() = delete; + ~ControllerTexts() = delete; + + struct BuzzerFreqText : public virtual TextInterface { public: String text() const override { return String{"buzzerFreq: "} + toString(controller.command.buzzer.freq); } }; + struct BuzzerPatternText : public virtual TextInterface { public: String text() const override { return String{"buzzerPattern: "} + toString(controller.command.buzzer.pattern); } }; + struct PoweroffText : public virtual TextInterface { public: String text() const override { return String{"poweroff: "} + toString(controller.command.poweroff); } }; + struct LedText : public virtual TextInterface { public: String text() const override { return String{"led: "} + toString(controller.command.led); } }; + + struct LeftCommand + { + LeftCommand() = delete; + ~LeftCommand() = delete; + + struct EnableText : public virtual TextInterface { public: String text() const override { return String{"enable: "} + toString(controller.command.left.enable); } }; + struct PwmText : public virtual TextInterface { public: String text() const override { return String{"pwm: "} + toString(controller.command.left.pwm); } }; + struct CtrlTypText : public virtual TextInterface { public: String text() const override { return String{"ctrlTyp: "} + toString(controller.command.left.ctrlTyp); } }; + struct CtrlModText : public virtual TextInterface { public: String text() const override { return String{"ctrlMod: "} + toString(controller.command.left.ctrlMod); } }; + struct IMotMaxText : public virtual TextInterface { public: String text() const override { return String{"iMotMax: "} + toString(controller.command.left.iMotMax); } }; + struct IDcMaxText : public virtual TextInterface { public: String text() const override { return String{"iDcMax: "} + toString(controller.command.left.iDcMax); } }; + struct NMotMaxText : public virtual TextInterface { public: String text() const override { return String{"nMotMax: "} + toString(controller.command.left.nMotMax); } }; + struct FieldWeakMaxText : public virtual TextInterface { public: String text() const override { return String{"fieldWeakMax: "} + toString(controller.command.left.fieldWeakMax); } }; + struct PhaseAdvMaxText : public virtual TextInterface { public: String text() const override { return String{"phaseAdvMax: "} + toString(controller.command.left.phaseAdvMax); } }; + }; + + struct RightCommand + { + RightCommand() = delete; + ~RightCommand() = delete; + + struct EnableText : public virtual TextInterface { public: String text() const override { return String{"enable: "} + toString(controller.command.right.enable); } }; + struct PwmText : public virtual TextInterface { public: String text() const override { return String{"pwm: "} + toString(controller.command.right.pwm); } }; + struct CtrlTypText : public virtual TextInterface { public: String text() const override { return String{"ctrlTyp: "} + toString(controller.command.right.ctrlTyp); } }; + struct CtrlModText : public virtual TextInterface { public: String text() const override { return String{"ctrlMod: "} + toString(controller.command.right.ctrlMod); } }; + struct IMotMaxText : public virtual TextInterface { public: String text() const override { return String{"iMotMax: "} + toString(controller.command.right.iMotMax); } }; + struct IDcMaxText : public virtual TextInterface { public: String text() const override { return String{"iDcMax: "} + toString(controller.command.right.iDcMax); } }; + struct NMotMaxText : public virtual TextInterface { public: String text() const override { return String{"nMotMax: "} + toString(controller.command.right.nMotMax); } }; + struct FieldWeakMaxText : public virtual TextInterface { public: String text() const override { return String{"fieldWeakMax: "} + toString(controller.command.right.fieldWeakMax); } }; + struct PhaseAdvMaxText : public virtual TextInterface { public: String text() const override { return String{"phaseAdvMax: "} + toString(controller.command.right.phaseAdvMax); } }; + }; + + struct BatVoltageText : public virtual TextInterface { public: String text() const override { auto line = String{"batVoltage: "}; if (controller.feedbackValid) line += toString(controller.feedback.batVoltage); return line; } }; + struct BatVoltageFixedText : public virtual TextInterface { public: String text() const override { auto line = String{"batVoltage: "}; if (controller.feedbackValid) line += toString(fixBatVoltage(controller.feedback.batVoltage)) + 'V'; return line; } }; + struct BoardTempText : public virtual TextInterface { public: String text() const override { auto line = String{"boardTemp: "}; if (controller.feedbackValid) line += toString(controller.feedback.boardTemp); return line; } }; + struct BoardTempFixedText : public virtual TextInterface { public: String text() const override { auto line = String{"boardTemp: "}; if (controller.feedbackValid) line += toString(fixBoardTemp(controller.feedback.boardTemp)) + 'C'; return line; } }; + struct TimeoutCntSerialText : public virtual TextInterface { public: String text() const override { auto line = String{"timeoutCntSerial: "}; if (controller.feedbackValid) line += toString(controller.feedback.timeoutCntSerial); return line; } }; + + struct LeftFeedback + { + LeftFeedback() = delete; + ~LeftFeedback() = delete; + + struct AngleText : public virtual TextInterface { public: String text() const override { auto line = String{"angle: "}; if (controller.feedbackValid) line += toString(controller.feedback.left.angle); return line; } }; + struct SpeedText : public virtual TextInterface { public: String text() const override { auto line = String{"speed: "}; if (controller.feedbackValid) line += toString(controller.feedback.left.speed); return line; } }; + struct SpeedKmhText : public virtual TextInterface { public: String text() const override { auto line = String{"speed kmh: "}; if (controller.feedbackValid) line += toString(convertToKmh(controller.feedback.left.speed)); return line; } }; + struct ErrorText : public virtual TextInterface { public: String text() const override { auto line = String{"error: "}; if (controller.feedbackValid) line += toString(controller.feedback.left.error); return line; } }; + struct CurrentText : public virtual TextInterface { public: String text() const override { auto line = String{"current: "}; if (controller.feedbackValid) line += toString(controller.feedback.left.current); return line; } }; + struct CurrentFixedText : public virtual TextInterface { public: String text() const override { auto line = String{"current: "}; if (controller.feedbackValid) line += toString(fixCurrent(controller.feedback.left.current)) + 'A'; return line; } }; + struct ChopsText : public virtual TextInterface { public: String text() const override { auto line = String{"chops: "}; if (controller.feedbackValid) line += toString(controller.feedback.left.chops); return line; } }; + struct HallText : public virtual TextInterface { public: String text() const override { auto line = String{"hall: "}; if (controller.feedbackValid) line += hallString(controller.feedback.left); return line; } }; + }; + + struct RightFeedback + { + RightFeedback() = delete; + ~RightFeedback() = delete; + + struct AngleText : public virtual TextInterface { public: String text() const override { auto line = String{"angle: "}; if (controller.feedbackValid) line += toString(controller.feedback.right.angle); return line; } }; + struct SpeedText : public virtual TextInterface { public: String text() const override { auto line = String{"speed: "}; if (controller.feedbackValid) line += toString(controller.feedback.right.speed); return line; } }; + struct SpeedKmhText : public virtual TextInterface { public: String text() const override { auto line = String{"speed kmh: "}; if (controller.feedbackValid) line += toString(convertToKmh(controller.feedback.right.speed)); return line; } }; + struct ErrorText : public virtual TextInterface { public: String text() const override { auto line = String{"error: "}; if (controller.feedbackValid) line += toString(controller.feedback.right.error); return line; } }; + struct CurrentText : public virtual TextInterface { public: String text() const override { auto line = String{"current: "}; if (controller.feedbackValid) line += toString(controller.feedback.right.current); return line; } }; + struct CurrentFixedText : public virtual TextInterface { public: String text() const override { auto line = String{"current: "}; if (controller.feedbackValid) line += toString(fixCurrent(controller.feedback.right.current)) + 'A'; return line; } }; + struct ChopsText : public virtual TextInterface { public: String text() const override { auto line = String{"chops: "}; if (controller.feedbackValid) line += toString(controller.feedback.right.chops); return line; } }; + struct HallText : public virtual TextInterface { public: String text() const override { auto line = String{"hall: "}; if (controller.feedbackValid) line += hallString(controller.feedback.right); return line; } }; + }; +}; + +using FrontTexts = ControllerTexts; +using BackTexts = ControllerTexts; +} diff --git a/src/demodisplay.h b/src/demodisplay.h new file mode 100644 index 0000000..8ad2d02 --- /dev/null +++ b/src/demodisplay.h @@ -0,0 +1,17 @@ +#pragma once + +#include "actioninterface.h" +#include "display.h" + +namespace { +class DemoDisplay : public Display, public virtual ActionInterface +{ +public: + void button() override; +}; + +void DemoDisplay::button() +{ + triggered(); +} +} diff --git a/src/display.h b/src/display.h new file mode 100644 index 0000000..4e95c49 --- /dev/null +++ b/src/display.h @@ -0,0 +1,30 @@ +#pragma once + +#include + +namespace { +class MenuDisplay; +class ChangeValueDisplayInterface; +} + +namespace { +class Display { +public: + virtual ~Display() = default; + + virtual void start() {}; + virtual void initScreen() {}; + virtual void update() {}; + virtual void redraw() {}; + virtual void stop() {} + + virtual void rotate(int offset) {} + virtual void button() {} + + virtual MenuDisplay *asMenuDisplay() { return nullptr; } + virtual const MenuDisplay *asMenuDisplay() const { return nullptr; } + + virtual ChangeValueDisplayInterface *asChangeValueDisplayInterface() { return nullptr; } + virtual const ChangeValueDisplayInterface *asChangeValueDisplayInterface() const { return nullptr; } +}; +} diff --git a/src/displays/bmsdisplay.h b/src/displays/bmsdisplay.h new file mode 100644 index 0000000..74c1ddf --- /dev/null +++ b/src/displays/bmsdisplay.h @@ -0,0 +1,89 @@ +#pragma once + +#include + +#include "demodisplay.h" +#include "actions/switchscreenaction.h" +#include "globals.h" +#include "bmsutils.h" +#include "widgets/label.h" + +namespace { +class MainMenu; +class MetersDisplay; +class StatusDisplay; +} +namespace { +class BmsDisplay : public DemoDisplay, public SwitchScreenAction +{ +public: + void initScreen() override; + void redraw() override; + + void rotate(int offset) override; + + Label m_statusLabel{0, 0}; + + Label m_voltageLabel{105, 50}; + Label m_currentLabel{105, 75}; + Label m_capacityLabel{105, 100}; + Label m_socLabel{105, 125}; + Label m_cycleLabel{105, 150}; + Label m_powerLabel{105, 175}; + + std::array m_battLabels{{ + Label{0, 225}, Label{60, 225}, Label{120, 225}, Label{180, 225}, + Label{0, 250}, Label{60, 250}, Label{120, 250}, Label{180, 250}, + Label{0, 275}, Label{60, 275}, Label{120, 275}, Label{180, 275} + }}; +}; + +void BmsDisplay::initScreen() +{ + tft.fillScreen(TFT_BLACK); + tft.setTextColor(TFT_WHITE, TFT_BLACK); + + tft.setTextFont(2); + m_statusLabel.start(); + m_statusLabel.redraw("init"); + + tft.setTextFont(4); + tft.drawString("Voltage:", 0, 50); + m_voltageLabel.start(); + tft.drawString("Current:", 0, 75); + m_currentLabel.start(); + tft.drawString("Capacity:", 0, 100); + m_capacityLabel.start(); + tft.drawString("SOC:", 0, 125); + m_socLabel.start(); + tft.drawString("Cycle:", 0, 150); + m_cycleLabel.start(); + tft.drawString("Power:", 0, 175); + m_powerLabel.start(); + + for (auto &label : m_battLabels) + label.start(); +} + +void BmsDisplay::redraw() +{ + m_statusLabel.redraw(bluetoothSerial.hasClient() ? "connected" : "not connected"); + m_voltageLabel.redraw(String{bms::voltage} + 'V'); + m_currentLabel.redraw(String{bms::current} + 'A'); + m_capacityLabel.redraw(String{int(bms::capacity)} + "mAh"); + m_socLabel.redraw(String{bms::soc} + '%'); + m_cycleLabel.redraw(String{bms::cycle} + "AH"); + m_powerLabel.redraw(String{bms::power} + 'W'); + + for (int i = 0; i < 12; i++) + m_battLabels[i].redraw(String{bms::batt[i]}); +} + +void BmsDisplay::rotate(int offset) +{ + if (offset < 0) + switchScreen(); + else if (offset > 0) + switchScreen(); +} +} diff --git a/src/displays/calibratedisplay.h b/src/displays/calibratedisplay.h new file mode 100644 index 0000000..717f45f --- /dev/null +++ b/src/displays/calibratedisplay.h @@ -0,0 +1,107 @@ +#pragma once + +#include + +#include + +#include "demodisplay.h" +#include "actions/switchscreenaction.h" +#include "globals.h" +#include "texts.h" +#include "widgets/label.h" +#include "widgets/progressbar.h" +#include "modes/ignoreinputmode.h" + +namespace { +class StatusDisplay; +class PotiSettingsMenu; +} + +namespace { +class CalibrateDisplay : public DemoDisplay +{ + using Base = DemoDisplay; + +public: + CalibrateDisplay() = default; + CalibrateDisplay(bool bootup); + + void start() override; + void initScreen() override; + void redraw() override; + void stop() override; + + void triggered() override; + +private: + const bool m_bootup{false}; + ModeInterface *m_oldMode; + IgnoreInputMode m_mode{0, ControlType::FieldOrientedControl, ControlMode::Torque}; + + std::array m_labels {{ + Label{25, 50}, // 100, 23 + Label{25, 75}, // 100, 23 + Label{25, 100}, // 100, 23 + Label{25, 125} // 100, 23 + }}; + + ProgressBar m_progressBar0{20, 200, 200, 10, 0, 1000}; + ProgressBar m_progressBar1{20, 230, 200, 10, 0, 1000}; +}; + +CalibrateDisplay::CalibrateDisplay(bool bootup) : + m_bootup{bootup} +{ +} + +void CalibrateDisplay::start() +{ + m_oldMode = currentMode; + currentMode = &m_mode; +} + +void CalibrateDisplay::initScreen() +{ + tft.fillScreen(TFT_BLACK); + tft.setTextFont(4); + tft.setTextColor(TFT_YELLOW); + + tft.drawString(TEXT_CALIBRATE, 5, 5, 4); + + tft.fillRect(0, 34, tft.width(), 3, TFT_WHITE); + + tft.setTextColor(TFT_WHITE, TFT_BLACK); + + for (auto &label : m_labels) + label.start(); + + m_progressBar0.start(); + m_progressBar1.start(); +} + +void CalibrateDisplay::redraw() +{ + m_labels[0].redraw(String{gas}); + m_labels[1].redraw(String{raw_gas}); + + m_labels[2].redraw(String{brems}); + m_labels[3].redraw(String{raw_brems}); + + m_progressBar0.redraw(gas); + m_progressBar1.redraw(brems); +} + +void CalibrateDisplay::stop() +{ + if (currentMode == &m_mode) + currentMode = m_oldMode; +} + +void CalibrateDisplay::triggered() +{ + if (m_bootup) + switchScreen(); + else + switchScreen(); +} +} diff --git a/src/displays/dualgraphdisplay.h b/src/displays/dualgraphdisplay.h new file mode 100644 index 0000000..fe4de7f --- /dev/null +++ b/src/displays/dualgraphdisplay.h @@ -0,0 +1,51 @@ +#pragma once + +#include "demodisplay.h" +#include "actions/switchscreenaction.h" +#include "textinterface.h" +#include "widgets/label.h" +#include "widgets/graph.h" +#include "globals.h" +#include "statistics.h" + +namespace { +class GraphsMenu; +} + +namespace { +class DualGraphDisplay : public DemoDisplay, public SwitchScreenAction +{ + using Base = DemoDisplay; + +public: + void initScreen() override; + void redraw() override; + +private: + Label m_titleLabel{5, 5}; // 230, 25 + + Graph<200, 1> m_graph0{0, 40, 133}; + Graph<200, 1> m_graph1{0, 179, 133}; +}; + +void DualGraphDisplay::initScreen() +{ + tft.fillScreen(TFT_BLACK); + + m_titleLabel.start(); + tft.fillRect(0, 34, tft.width(), 3, TFT_WHITE); + + m_graph0.start({statistics::gas}); + m_graph1.start({statistics::brems}); +} + +void DualGraphDisplay::redraw() +{ + tft.setTextFont(4); + tft.setTextColor(TFT_YELLOW, TFT_BLACK); + m_titleLabel.redraw("Gas/Brems dual"); + + m_graph0.redraw({statistics::gas}); + m_graph1.redraw({statistics::brems}); +} +} diff --git a/src/displays/gameoflifedisplay.h b/src/displays/gameoflifedisplay.h new file mode 100644 index 0000000..e88daaf --- /dev/null +++ b/src/displays/gameoflifedisplay.h @@ -0,0 +1,188 @@ +#pragma once + +#include +#include + +#include +#include + +#include "demodisplay.h" +#include "actions/switchscreenaction.h" + +namespace { +class DemosMenu; +} + +namespace { +class GameOfLifeDisplay : public DemoDisplay, public SwitchScreenAction +{ + using Base = DemoDisplay; + +public: + void start() override; + void initScreen() override; + void redraw() override; + void stop() override; + +private: + + //Draws the grid on the display + void drawGrid(); + + //Initialise Grid + void initGrid(); + + // Check the Moore neighborhood + int getNumberOfNeighbors(int x, int y); + + //Compute the CA. Basically everything related to CA starts here + void computeCA(); + + //static const constexpr auto GRIDX = 80; + //static const constexpr auto GRIDY = 60; + //static const constexpr auto CELLXY = 4; + + static const constexpr auto GRIDX = 160; + static const constexpr auto GRIDY = 120; + static const constexpr auto CELLXY = 2; + + static const constexpr auto GEN_DELAY = 0; + + template auto index(T x, T y) + { + if (x >= GRIDX) + { + Serial.printf("x: %i", x); + return 0; + } + if (y >= GRIDY) + { + Serial.printf("y: %i", x); + return 0; + } + return (x * GRIDX) + y; + } + + struct Data + { + std::bitset grid, newgrid; + }; + + std::unique_ptr m_data; + + int gen = 0; +}; + +void GameOfLifeDisplay::start() +{ + m_data = std::make_unique(); +} + +void GameOfLifeDisplay::initScreen() +{ + tft.setRotation(3); + tft.fillScreen(TFT_BLACK); +} + +void GameOfLifeDisplay::redraw() +{ + if (gen == 0) + { + tft.fillScreen(TFT_BLACK); + initGrid(); + } + + computeCA(); + drawGrid(); + + m_data->grid = m_data->newgrid; +// for (int16_t x = 1; x < GRIDX-1; x++) { +// for (int16_t y = 1; y < GRIDY-1; y++) { +// grid[index(x,y)] = m_data->newgrid[index(x,y)]; +// } +// } + + if (++gen == 200) + gen = 0; +} + +void GameOfLifeDisplay::stop() +{ + tft.setRotation(0); + m_data = nullptr; +} + +void GameOfLifeDisplay::drawGrid() +{ + uint16_t color = TFT_WHITE; + for (int16_t x = 1; x < GRIDX - 1; x++) { + for (int16_t y = 1; y < GRIDY - 1; y++) { + if ((m_data->grid[index(x,y)]) != (m_data->newgrid[index(x,y)])) { + if (m_data->newgrid[index(x,y)] == 1) + color = 0xFFFF; //random(0xFFFF); + else + color = 0; + tft.fillRect(CELLXY * x, CELLXY * y, CELLXY, CELLXY, color); + } + } + } +} + +void GameOfLifeDisplay::initGrid() +{ + for (int16_t x = 0; x < GRIDX; x++) { + for (int16_t y = 0; y < GRIDY; y++) { + m_data->newgrid[index(x,y)] = 0; + + if (x == 0 || x == GRIDX - 1 || y == 0 || y == GRIDY - 1) + m_data->grid[index(x,y)] = 0; + else + { + if (random(3) == 1) + m_data->grid[index(x,y)] = 1; + else + m_data->grid[index(x,y)] = 0; + } + + } + } +} + +int GameOfLifeDisplay::getNumberOfNeighbors(int x, int y) +{ + int n{}; + for (auto xOffset : {-1,0,1}) + for (auto yOffset : {-1,0,1}) + { + if (xOffset == 0 && yOffset == 0) + continue; + + const auto new_x = x+xOffset; + const auto new_y = y+yOffset; + + if (new_x >= 0 && new_y >= 0 && + new_x < GRIDX && new_y < GRIDY) + n += m_data->grid[index(new_x, new_y)]; + } + + return n; +} + +void GameOfLifeDisplay::computeCA() +{ + for (int16_t x = 1; x < GRIDX; x++) { + for (int16_t y = 1; y < GRIDY; y++) { + int neighbors = getNumberOfNeighbors(x, y); + if (m_data->grid[index(x,y)] == true && (neighbors == 2 || neighbors == 3 )) + m_data->newgrid[index(x,y)] = true; + else if (m_data->grid[index(x,y)] == 1) + m_data->newgrid[index(x,y)] = false; + if (m_data->grid[index(x,y)] == false && (neighbors == 3)) + m_data->newgrid[index(x,y)] = true; + else if (m_data->grid[index(x,y)] == 0) + m_data->newgrid[index(x,y)] = false; + } + } +} + +} diff --git a/src/displays/graphdisplay.h b/src/displays/graphdisplay.h new file mode 100644 index 0000000..8d735c2 --- /dev/null +++ b/src/displays/graphdisplay.h @@ -0,0 +1,70 @@ +#pragma once + +#include "demodisplay.h" +#include "actions/switchscreenaction.h" +#include "textinterface.h" +#include "widgets/label.h" +#include "widgets/graph.h" +#include "globals.h" +#include "statistics.h" + +namespace { +class GraphsMenu; +} + +namespace { +template +class MultiStatisticsInterface +{ +public: + virtual std::array, COUNT> getBuffers() const = 0; +}; + +class MultiStatisticsSingleImpl : public virtual MultiStatisticsInterface<1>, public virtual BufferAccessorInterface +{ +public: + std::array, 1> getBuffers() const + { + return {getBuffer()}; + } +}; + +template +class GraphDisplay : public DemoDisplay, public SwitchScreenAction, public virtual TextInterface, public virtual MultiStatisticsInterface +{ + using Base = DemoDisplay; + +public: + void initScreen() override; + void redraw() override; + +private: + static constexpr int screenHeight = 320, topMargin = 40, bottomMargin = 10, labelOffset = -5; + static constexpr int graphHeight = screenHeight-topMargin-bottomMargin; + + Label m_titleLabel{5, 5}; // 230, 25 + + Graph<200, COUNT> m_graph{0, 40, 270}; +}; + +template +void GraphDisplay::initScreen() +{ + tft.fillScreen(TFT_BLACK); + + m_titleLabel.start(); + tft.fillRect(0, 34, tft.width(), 3, TFT_WHITE); + + m_graph.start(static_cast &>(*this).getBuffers()); +} + +template +void GraphDisplay::redraw() +{ + tft.setTextFont(4); + tft.setTextColor(TFT_YELLOW, TFT_BLACK); + m_titleLabel.redraw(text()); + + m_graph.redraw(static_cast &>(*this).getBuffers()); +} +} diff --git a/src/displays/lockscreen.h b/src/displays/lockscreen.h new file mode 100644 index 0000000..46b153d --- /dev/null +++ b/src/displays/lockscreen.h @@ -0,0 +1,163 @@ +#pragma once + +#include + +#include "display.h" +#include "widgets/label.h" +#include "globals.h" +#include "utils.h" +#include "texts.h" +#include "modes/ignoreinputmode.h" + +namespace { +class MainMenu; +} + +namespace { +class Lockscreen : public Display +{ + using Base = Display; + + static constexpr auto boxWidth = 35; + static constexpr auto boxHeight = 50; + static constexpr auto spacing = 20; + +public: + void start() override; + void initScreen() override; + void update() override {} + void redraw() override; + void stop() override; + + void button() override; + void rotate(int offset) override; + +private: + void drawRect(int index, int offset, uint32_t color) const; + + std::array m_labels {{ + Label{spacing, 100}, // boxWidth, boxHeight + Label{spacing*2+boxWidth, 100}, // boxWidth, boxHeight + Label{spacing*3+boxWidth*2, 100}, // boxWidth, boxHeight + Label{spacing*4+boxWidth*3, 100} // boxWidth, boxHeight + }}; + + std::array m_numbers; + + uint8_t m_currentIndex{}; + + bool m_pressed; + int m_rotated; + + ModeInterface *m_oldMode; + IgnoreInputMode m_mode{0, ControlType::FieldOrientedControl, ControlMode::Speed}; +}; + +void Lockscreen::start() +{ + m_numbers = {0,0,0,0}; + m_currentIndex = 0; + m_pressed = false; + m_rotated = 0; + + m_oldMode = currentMode; + currentMode = &m_mode; +} + +void Lockscreen::initScreen() +{ + tft.fillScreen(TFT_BLACK); + tft.setTextFont(4); + tft.setTextColor(TFT_YELLOW); + + tft.drawString(TEXT_LOCKVEHICLE, 5, 5); + + tft.fillRect(0, 34, tft.width(), 3, TFT_WHITE); + + tft.setTextColor(TFT_WHITE); + tft.drawString("Enter code to unlock:", 0, 50); + + tft.setTextColor(TFT_WHITE, TFT_BLACK); + + for(int i = 0; i <= 3; i++) + { + drawRect(i, 3, TFT_WHITE); + drawRect(i, 4, TFT_WHITE); + } + + for (auto &label : m_labels) + label.start(); + + tft.setTextFont(7); + + drawRect(0, 1, TFT_YELLOW); + drawRect(0, 2, TFT_YELLOW); + m_labels[0].redraw(String(m_numbers[0])); +} + +void Lockscreen::redraw() +{ + if (m_pressed) + { + drawRect(m_currentIndex, 1, TFT_BLACK); + drawRect(m_currentIndex, 2, TFT_BLACK); + + if (++m_currentIndex>=4) + { + if (m_numbers == decltype(m_numbers){1,2,3,4}) + { + switchScreen(); + return; + } + + m_numbers = {0,0,0,0}; + m_currentIndex = 0; + std::for_each(std::begin(m_labels) + 1, std::end(m_labels), [](auto &label){ label.redraw({}); }); + } + + m_labels[m_currentIndex].redraw(String{m_numbers[m_currentIndex]}); + + drawRect(m_currentIndex, 1, TFT_YELLOW); + drawRect(m_currentIndex, 2, TFT_YELLOW); + + m_pressed = false; + } + + if (m_rotated) + { + m_numbers[m_currentIndex] -= m_rotated; + + if (m_numbers[m_currentIndex] < 0) + m_numbers[m_currentIndex]+=10; + else if (m_numbers[m_currentIndex] > 9) + m_numbers[m_currentIndex]-=10; + + m_labels[m_currentIndex].redraw(String(m_numbers[m_currentIndex])); + + m_rotated = 0; + } +} + +void Lockscreen::stop() +{ + Base::stop(); + + if (currentMode == &m_mode) + currentMode = m_oldMode; +} + +void Lockscreen::button() +{ + m_pressed = true; +} + +void Lockscreen::rotate(int offset) +{ + m_rotated += offset; +} + +void Lockscreen::drawRect(int index, int offset, uint32_t color) const +{ + tft.drawRect(m_labels[index].x()-offset, m_labels[index].y()-offset, boxWidth+(offset*2), boxHeight+(offset*2), color); +} +} diff --git a/src/displays/matrixdisplay.h b/src/displays/matrixdisplay.h new file mode 100644 index 0000000..7f7a824 --- /dev/null +++ b/src/displays/matrixdisplay.h @@ -0,0 +1,94 @@ +#pragma once + +#include "demodisplay.h" +#include "actions/switchscreenaction.h" +#include "globals.h" +#include "utils.h" +#include "texts.h" + +namespace { +class DemosMenu; +} + +namespace { +class MatrixDisplay : public DemoDisplay, public SwitchScreenAction +{ + using Base = DemoDisplay; + +public: + void initScreen() override; + void redraw() override; + void stop() override; + +private: + int scroll_slow(int lines, int wait); + + static constexpr auto TEXT_HEIGHT = 8; // Height of text to be printed and scrolled + static constexpr auto BOT_FIXED_AREA = 0; // Number of lines in bottom fixed area (lines counted from bottom of screen) + static constexpr auto TOP_FIXED_AREA = 0; // Number of lines in top fixed area (lines counted from top of screen) + + uint16_t yStart = TOP_FIXED_AREA; + uint16_t yArea = 320 - TOP_FIXED_AREA - BOT_FIXED_AREA; + uint16_t yDraw = 320 - BOT_FIXED_AREA - TEXT_HEIGHT; + byte pos[42]; + uint16_t xPos = 0; +}; + +void MatrixDisplay::initScreen() +{ + tft.setRotation(2); + tft.fillScreen(TFT_BLACK); + setupScrollArea(TOP_FIXED_AREA, BOT_FIXED_AREA); + + // First fill the screen with random streaks of characters + for (int j = 0; j < 600; j += TEXT_HEIGHT) + { + for (int i = 0; i < 40; i++) + { + if (pos[i] > 20) + pos[i] -= 3; // Rapid fade initially brightness values + + if (pos[i] > 0) + pos[i] -= 1; // Slow fade later + + if ((random(20) == 1) && (j<400)) + pos[i] = 63; // ~1 in 20 probability of a new character + + tft.setTextColor(pos[i] << 5, TFT_BLACK); // Set the green character brightness + + if (pos[i] == 63) + tft.setTextColor(TFT_WHITE, TFT_BLACK); // Draw white character + + xPos += tft.drawChar(random(32, 128), xPos, yDraw, 1); // Draw the character + } + yDraw = scroll_slow(TEXT_HEIGHT, 14); // Scroll, 14ms per pixel line + xPos = 0; + } +} + +void MatrixDisplay::redraw() +{ + yDraw = scroll_slow(320,5); +} + +void MatrixDisplay::stop() +{ + scrollAddress(0); + tft.setRotation(0); +} + +int MatrixDisplay::scroll_slow(int lines, int wait) +{ + int yTemp = yStart; + + for (int i = 0; i < lines; i++) { + yStart++; + if (yStart == 320 - BOT_FIXED_AREA) + yStart = TOP_FIXED_AREA; + scrollAddress(yStart); + delay(wait); + } + + return yTemp; +} +} diff --git a/src/displays/menus/aboutmenu.h b/src/displays/menus/aboutmenu.h new file mode 100644 index 0000000..cb1c64b --- /dev/null +++ b/src/displays/menus/aboutmenu.h @@ -0,0 +1,48 @@ +#pragma once + +#include "menudisplay.h" +#include "staticmenudefinition.h" +#include "utils.h" +#include "actions/dummyaction.h" +#include "actions/switchscreenaction.h" +#include "icons/back.h" +#include "esptexthelpers.h" +#include "texts.h" + +namespace { +class SettingsMenu; +} + +namespace { +constexpr char TEXT_VERSION[] = "Version: 1.0"; +constexpr char TEXT_ESPINFO[] = "ESP info:"; + +class AboutMenu : + public MenuDisplay, + public StaticText, + public StaticMenuDefinition< + makeComponent, DummyAction>, + makeComponent, DummyAction>, + makeComponent, DummyAction>, + makeComponent, DisabledColor, DummyAction>, + makeComponent, DisabledColor, DummyAction>, + makeComponent, DisabledColor, DummyAction>, + makeComponent, DisabledColor, DummyAction>, + makeComponent, DisabledColor, DummyAction>, + makeComponent, DisabledColor, DummyAction>, + makeComponent, DisabledColor, DummyAction>, + makeComponent, DisabledColor, DummyAction>, + makeComponent, DisabledColor, DummyAction>, + makeComponent, DisabledColor, DummyAction>, + makeComponent, DisabledColor, DummyAction>, + makeComponent, DisabledColor, DummyAction>, + makeComponent, DisabledColor, DummyAction>, + makeComponent, DisabledColor, DummyAction>, + makeComponent, DisabledColor, DummyAction>, + makeComponent, DisabledColor, DummyAction>, + makeComponent, DisabledColor, DummyAction>, + makeComponent, DisabledColor, DummyAction>, + makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>> + > +{}; +} diff --git a/src/displays/menus/accesspointwifisettingsmenu.h b/src/displays/menus/accesspointwifisettingsmenu.h new file mode 100644 index 0000000..5b75b12 --- /dev/null +++ b/src/displays/menus/accesspointwifisettingsmenu.h @@ -0,0 +1,66 @@ +#pragma once + +#include "menudisplay.h" +#include "staticmenudefinition.h" +#include "menuitem.h" +#include "actions/dummyaction.h" +#include "actions/wifisoftapenableipv6action.h" +#include "actions/switchscreenaction.h" +#include "icons/back.h" +#include "texts.h" + +namespace { +class WifiSettingsMenu; +} + +namespace { +class WifiSoftApGetStationNumText : public virtual TextInterface { +public: + String text() const override { return String{"softAPgetStationNum: "} + WiFi.softAPgetStationNum(); } +}; +class WifiSoftApIpText : public virtual TextInterface { +public: + String text() const override { return String{"softAPIP: "} + WiFi.softAPIP().toString(); } +}; +class WifiSoftApBroadcastIpText : public virtual TextInterface { +public: + String text() const override { return String{"softAPBroadcastIP: "} + WiFi.softAPBroadcastIP().toString(); } +}; +class WifiSoftApNetworkIdText : public virtual TextInterface { +public: + String text() const override { return String{"softAPNetworkID: "} + WiFi.softAPNetworkID().toString(); } +}; +class WifiSoftApSubnetCidrText : public virtual TextInterface { +public: + String text() const override { return String{"softAPSubnetCIDR: "} + WiFi.softAPSubnetCIDR(); } +}; +class WifiSoftApIpV6Text : public virtual TextInterface { +public: + String text() const override { return String{"softAPIPv6: "} + WiFi.softAPIPv6().toString(); } +}; +class WifiSoftApHostnameText : public virtual TextInterface { +public: + String text() const override { return String{"softAPgetHostname: "} + WiFi.softAPgetHostname(); } +}; +class WifiSoftApMacAddressText : public virtual TextInterface { +public: + String text() const override { return String{"softAPmacAddress: "} + WiFi.softAPmacAddress(); } +}; + +class AccessPointWifiSettingsMenu : + public MenuDisplay, + public StaticText, + public StaticMenuDefinition< + makeComponent, DisabledColor, DummyAction>, + makeComponent, DisabledColor, DummyAction>, + makeComponent, DisabledColor, DummyAction>, + makeComponent, DisabledColor, DummyAction>, + makeComponent, DisabledColor, DummyAction>, + makeComponent, WifiSoftApEnableIpV6Action>, + makeComponent, DisabledColor, DummyAction>, + makeComponent, DisabledColor, DummyAction>, + makeComponent, DisabledColor, DummyAction>, + makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>> + > +{}; +} diff --git a/src/displays/menus/bluetoothsettingsmenu.h b/src/displays/menus/bluetoothsettingsmenu.h new file mode 100644 index 0000000..00f3e6c --- /dev/null +++ b/src/displays/menus/bluetoothsettingsmenu.h @@ -0,0 +1,39 @@ +#pragma once + +#include "menudisplay.h" +#include "staticmenudefinition.h" +#include "menuitem.h" +#include "actions/dummyaction.h" +#include "actions/bluetoothbeginaction.h" +#include "actions/bluetoothbeginmasteraction.h" +#include "actions/bluetoothflushaction.h" +#include "actions/bluetoothendaction.h" +#include "actions/bluetoothdisconnectaction.h" +#include "actions/switchscreenaction.h" +#include "bluetoothtexthelpers.h" +#include "icons/back.h" +#include "texts.h" + +namespace { +class SettingsMenu; +} + +namespace { +class BluetoothSettingsMenu : + public MenuDisplay, + public StaticText, + public StaticMenuDefinition< + makeComponent, + makeComponent, +// makeComponent, // crashes + makeComponent, + makeComponent, + makeComponent, BluetoothBeginAction>, + makeComponent, BluetoothBeginMasterAction>, + makeComponent, BluetoothFlushAction>, + makeComponent, BluetoothEndAction>, + makeComponent, BluetoothDisconnectAction>, + makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>> + > +{}; +} diff --git a/src/displays/menus/bmsmenu.h b/src/displays/menus/bmsmenu.h new file mode 100644 index 0000000..f5cdcbb --- /dev/null +++ b/src/displays/menus/bmsmenu.h @@ -0,0 +1,38 @@ +#pragma once + +#include "menudisplay.h" +#include "staticmenudefinition.h" +#include "utils.h" +#include "menuitem.h" +#include "actions/bluetoothconnectbmsaction.h" +#include "actions/bluetoothdisconnectaction.h" +#include "actions/dummyaction.h" +#include "actions/bmsturnonchargeaction.h" +#include "actions/bmsturnoffchargeaction.h" +#include "actions/bmsturnondischargeaction.h" +#include "actions/bmsturnoffdischargeaction.h" +#include "actions/switchscreenaction.h" +#include "bluetoothtexthelpers.h" +#include "icons/back.h" +#include "texts.h" + +namespace { +class MainMenu; +} + +namespace { +class BmsMenu : + public MenuDisplay, + public StaticText, + public StaticMenuDefinition< + makeComponent, BluetoothConnectBmsAction>, + makeComponent, BluetoothDisconnectAction>, + makeComponent, + makeComponent, BmsTurnOnChargeAction>, + makeComponent, BmsTurnOffChargeAction>, + makeComponent, BmsTurnOnDischargeAction>, + makeComponent, BmsTurnOffDischargeAction>, + makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>> + > +{}; +} diff --git a/src/displays/menus/buzzermenu.h b/src/displays/menus/buzzermenu.h new file mode 100644 index 0000000..810978f --- /dev/null +++ b/src/displays/menus/buzzermenu.h @@ -0,0 +1,55 @@ +#pragma once + +#include "menudisplay.h" +#include "staticmenudefinition.h" +#include "utils.h" +#include "changevaluedisplay.h" +#include "menuitem.h" +#include "actions/switchscreenaction.h" +#include "actions/toggleboolaction.h" +#include "checkboxicon.h" +#include "icons/back.h" +#include "texts.h" +#include "globals.h" +#include "settingsaccessors.h" + +namespace { +class BuzzerMenu; +class SettingsMenu; +} + +namespace { +struct FrontFreqAccessor : public RefAccessor { uint8_t &getRef() const override { return front.command.buzzer.freq; } }; +using FrontFreqChangeScreen = makeComponent, StaticText, FrontFreqAccessor, SwitchScreenAction>; + +struct FrontPatternAccessor : public RefAccessor { uint8_t &getRef() const override { return front.command.buzzer.pattern; } }; +using FrontPatternChangeScreen = makeComponent, StaticText, FrontPatternAccessor, SwitchScreenAction>; + +struct BackFreqAccessor : public RefAccessor { uint8_t &getRef() const override { return back.command.buzzer.freq; } }; +using BackFreqChangeScreen = makeComponent, StaticText, BackFreqAccessor, SwitchScreenAction>; + +struct BackPatternAccessor : public RefAccessor { uint8_t &getRef() const override { return back.command.buzzer.pattern; } }; +using BackPatternChangeScreen = makeComponent, StaticText, BackPatternAccessor, SwitchScreenAction>; + +using ReverseBeepFreq0ChangeScreen = makeComponent, StaticText, ReverseBeepFreq0Accessor, SwitchScreenAction>; +using ReverseBeepFreq1ChangeScreen = makeComponent, StaticText, ReverseBeepFreq1Accessor, SwitchScreenAction>; +using ReverseBeepDuration0ChangeScreen = makeComponent, StaticText, ReverseBeepDuration0Accessor, SwitchScreenAction>; +using ReverseBeepDuration1ChangeScreen = makeComponent, StaticText, ReverseBeepDuration1Accessor, SwitchScreenAction>; + +class BuzzerMenu : + public MenuDisplay, + public StaticText, + public StaticMenuDefinition< + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction>, + makeComponent, ToggleBoolAction, CheckboxIcon, ReverseBeepAccessor>, + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>> + > +{}; +} diff --git a/src/displays/menus/commanddebugmenu.h b/src/displays/menus/commanddebugmenu.h new file mode 100644 index 0000000..0861d1a --- /dev/null +++ b/src/displays/menus/commanddebugmenu.h @@ -0,0 +1,33 @@ +#pragma once + +#include "menudisplay.h" +#include "staticmenudefinition.h" +#include "utils.h" +#include "menuitem.h" +#include "actions/dummyaction.h" +#include "actions/switchscreenaction.h" +#include "icons/back.h" +#include "texts.h" +#include "debugtexthelpers.h" + +namespace { +class DebugMenu; +} + +namespace { +template +class CommandDebugMenu : + public MenuDisplay, + public StaticText, + public StaticMenuDefinition< + makeComponent, + makeComponent, + makeComponent, + makeComponent, + makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>> + > +{}; + +class FrontCommandDebugMenu : public CommandDebugMenu {}; +class BackCommandDebugMenu : public CommandDebugMenu {}; +} diff --git a/src/displays/menus/debugmenu.h b/src/displays/menus/debugmenu.h new file mode 100644 index 0000000..de8a1d7 --- /dev/null +++ b/src/displays/menus/debugmenu.h @@ -0,0 +1,63 @@ +#pragma once + +#include "menudisplay.h" +#include "staticmenudefinition.h" +#include "utils.h" +#include "menuitem.h" +#include "actions/loadsettingsaction.h" +#include "actions/savesettingsaction.h" +#include "actions/switchscreenaction.h" +#include "actions/dummyaction.h" +#include "actions/toggleboolaction.h" +#include "icons/lock.h" +#include "checkboxicon.h" +#include "icons/back.h" +#include "texts.h" +#include "debugcolorhelpers.h" + +namespace { +class MainMenu; +class FrontCommandDebugMenu; +class BackCommandDebugMenu; +class FrontLeftMotorStateDebugMenu; +class FrontRightMotorStateDebugMenu; +class BackLeftMotorStateDebugMenu; +class BackRightMotorStateDebugMenu; +class FrontFeedbackDebugMenu; +class BackFeedbackDebugMenu; +class FrontLeftMotorFeedbackDebugMenu; +class FrontRightMotorFeedbackDebugMenu; +class BackLeftMotorFeedbackDebugMenu; +class BackRightMotorFeedbackDebugMenu; +class DynamicDebugMenu; +} + +namespace { +class DebugMenu : + public MenuDisplay, + public StaticText, + public StaticMenuDefinition< + makeComponent, LoadSettingsAction>, + makeComponent, SaveSettingsAction>, + makeComponent, DummyAction>, + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction>, + makeComponent, DummyAction>, + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction>, + makeComponent, DummyAction>, + makeComponent, SwitchScreenAction, FrontFeedbackColor>, + makeComponent, SwitchScreenAction, BackFeedbackColor>, + makeComponent, DummyAction>, + makeComponent, SwitchScreenAction, FrontFeedbackColor>, + makeComponent, SwitchScreenAction, FrontFeedbackColor>, + makeComponent, SwitchScreenAction, BackFeedbackColor>, + makeComponent, SwitchScreenAction, BackFeedbackColor>, + makeComponent, DummyAction>, + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>> + > +{}; +} diff --git a/src/displays/menus/defaultmodesettingsmenu.h b/src/displays/menus/defaultmodesettingsmenu.h new file mode 100644 index 0000000..3f53c93 --- /dev/null +++ b/src/displays/menus/defaultmodesettingsmenu.h @@ -0,0 +1,50 @@ +#pragma once + +#include "menudisplay.h" +#include "staticmenudefinition.h" +#include "utils.h" +#include "changevaluedisplay.h" +#include "menuitem.h" +#include "actions/toggleboolaction.h" +#include "actions/switchscreenaction.h" +#include "checkboxicon.h" +#include "icons/back.h" +#include "texts.h" +#include "settingsaccessors.h" + +namespace { +class DefaultModeSettingsMenu; +class ModesSettingsMenu; +} + +namespace { +using DefaultModeCtrlTypChangeDisplay = makeComponent, StaticText, DefaultModeCtrlTypAccessor, SwitchScreenAction>; +using DefaultModeCtrlModChangeDisplay = makeComponent, StaticText, DefaultModeCtrlModAccessor, SwitchScreenAction>; +using DefaultModeSmoothingChangeDisplay = makeComponent, StaticText, DefaultModeSmoothingAccessor, SwitchScreenAction>; +using DefaultModeFrontPercentageChangeDisplay = makeComponent, StaticText, DefaultModeFrontPercentageAccessor, SwitchScreenAction>; +using DefaultModeBackPercentageChangeDisplay = makeComponent, StaticText, DefaultModeBackPercentageAccessor, SwitchScreenAction>; +using DefaultModeAddSchwelleChangeDisplay = makeComponent, StaticText, DefaultModeAddSchwelleAccessor, SwitchScreenAction>; +using DefaultModeGas1WertChangeDisplay = makeComponent, StaticText, DefaultModeGas1WertAccessor, SwitchScreenAction>; +using DefaultModeGas2WertChangeDisplay = makeComponent, StaticText, DefaultModeGas2WertAccessor, SwitchScreenAction>; +using DefaultModeBrems1WertChangeDisplay = makeComponent, StaticText, DefaultModeBrems1WertAccessor, SwitchScreenAction>; +using DefaultModeBrems2WertChangeDisplay = makeComponent, StaticText, DefaultModeBrems2WertAccessor, SwitchScreenAction>; + +class DefaultModeSettingsMenu : + public MenuDisplay, + public StaticText, + public StaticMenuDefinition< + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction>, + makeComponent, ToggleBoolAction, CheckboxIcon, DefaultModeEnableSmoothingAccessor>, + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>> + > +{}; +} diff --git a/src/displays/menus/demosmenu.h b/src/displays/menus/demosmenu.h new file mode 100644 index 0000000..fc51721 --- /dev/null +++ b/src/displays/menus/demosmenu.h @@ -0,0 +1,33 @@ +#pragma once + +#include "menudisplay.h" +#include "staticmenudefinition.h" +#include "utils.h" +#include "menuitem.h" +#include "actions/switchscreenaction.h" +#include "icons/back.h" +#include "texts.h" + +namespace { +class StarfieldDisplay; +class PingPongDisplay; +class SpiroDisplay; +class GameOfLifeDisplay; +class MatrixDisplay; +class MainMenu; +} + +namespace { +class DemosMenu : + public MenuDisplay, + public StaticText, + public StaticMenuDefinition< + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>> + > +{}; +} diff --git a/src/displays/menus/dynamicdebugmenu.h b/src/displays/menus/dynamicdebugmenu.h new file mode 100644 index 0000000..1311776 --- /dev/null +++ b/src/displays/menus/dynamicdebugmenu.h @@ -0,0 +1,153 @@ +#pragma once + +#include +#include + +#include "menudisplay.h" +#include "staticmenudefinition.h" +#include "utils.h" +#include "menuitem.h" +#include "actions/switchscreenaction.h" +#include "actions/dummyaction.h" +#include "actions/toggleboolaction.h" +#include "icons/lock.h" +#include "checkboxicon.h" +#include "icons/back.h" +#include "texts.h" + +namespace { +class DebugMenu; +} + +namespace { +class RandomText : public virtual TextInterface +{ +public: + String text() const override + { + const auto now = millis(); + if (!m_nextUpdate || now >= m_nextUpdate) + { + m_title = String{"Dynamic text: "} + random(0, 100); + m_nextUpdate = now + random(0, 1000); + } + + return m_title; + } + +private: + mutable unsigned long m_nextUpdate{}; + mutable String m_title; +}; + +class RandomColor : public virtual ColorInterface +{ +public: + int color() const override + { + const auto now = millis(); + if (!m_nextUpdate || now >= m_nextUpdate) + { + const auto count = std::distance(std::begin(default_4bit_palette), std::end(default_4bit_palette)); + m_color = default_4bit_palette[random(0, count)]; + m_nextUpdate = now + random(0, 1000); + } + + return m_color; + } + +private: + mutable unsigned long m_nextUpdate{}; + mutable int m_color; +}; + +class RandomFont : public virtual FontInterface +{ +public: + int font() const override + { + const auto now = millis(); + if (!m_nextUpdate || now >= m_nextUpdate) + { + m_font = random(1, 5); + m_nextUpdate = now + random(0, 1000); + } + + return m_font; + } + +private: + mutable unsigned long m_nextUpdate{}; + mutable int m_font; +}; + +class RandomIcon : public virtual MenuItemIconInterface +{ +public: + const MenuItemIcon *icon() const override + { + const auto now = millis(); + if (!m_nextUpdate || now >= m_nextUpdate) + { + if (m_icon) + m_icon = nullptr; + else + m_icon = &icons::lock; + m_nextUpdate = now + random(0, 1000); + } + + return m_icon; + } + +private: + mutable unsigned long m_nextUpdate{}; + mutable const Icon<24, 24> *m_icon; +}; + +bool toggle; +struct ToggleAccessor : public virtual RefAccessor +{ +public: + bool &getRef() const override { return toggle; } +}; + +constexpr char TEXT_DUMMYITEM[] = "Dummy item"; +constexpr char TEXT_DYNAMICCOLOR[] = "Dynamic color"; +constexpr char TEXT_DYNAMICFONT[] = "Dynamic font"; +constexpr char TEXT_DYNAMICICON[] = "Dynamic icon"; +constexpr char TEXT_STATICICON[] = "Static icon"; +constexpr char TEXT_DEBUGTOGGLE[] = "Toggle"; + +class DynamicDebugMenu : + public MenuDisplay, + public RandomText, + public StaticMenuDefinition< + // dummy items to allow for scrolling + makeComponent, DummyAction>, + makeComponent, DummyAction>, + makeComponent, DummyAction>, + makeComponent, DummyAction>, + makeComponent, DummyAction>, + makeComponent, DummyAction>, + + // the interesting bits + makeComponent, + makeComponent, RandomColor, DummyAction>, + makeComponent, RandomFont, DummyAction>, + makeComponent, RandomIcon, DummyAction>, + makeComponent, StaticMenuItemIcon<&icons::lock>, DummyAction>, + makeComponent, ToggleBoolAction, CheckboxIcon, ToggleAccessor>, + makeComponent, + + // more scrolling + makeComponent, DummyAction>, + makeComponent, DummyAction>, + makeComponent, DummyAction>, + makeComponent, DummyAction>, + makeComponent, DummyAction>, + makeComponent, DummyAction>, + + makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>> + > +{}; +} diff --git a/src/displays/menus/enablemenu.h b/src/displays/menus/enablemenu.h new file mode 100644 index 0000000..c06f163 --- /dev/null +++ b/src/displays/menus/enablemenu.h @@ -0,0 +1,30 @@ +#pragma once + +#include "menudisplay.h" +#include "staticmenudefinition.h" +#include "utils.h" +#include "menuitem.h" +#include "actions/toggleboolaction.h" +#include "actions/switchscreenaction.h" +#include "checkboxicon.h" +#include "icons/back.h" +#include "texts.h" +#include "settingsaccessors.h" + +namespace { +class HardwareSettingsMenu; +} + +namespace { +class EnableMenu : + public MenuDisplay, + public StaticText, + public StaticMenuDefinition< + makeComponent, ToggleBoolAction, CheckboxIcon, FrontLeftEnabledAccessor>, + makeComponent, ToggleBoolAction, CheckboxIcon, FrontRightEnabledAccessor>, + makeComponent, ToggleBoolAction, CheckboxIcon, BackLeftEnabledAccessor>, + makeComponent, ToggleBoolAction, CheckboxIcon, BackRightEnabledAccessor>, + makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>> + > +{}; +} diff --git a/src/displays/menus/feedbackdebugmenu.h b/src/displays/menus/feedbackdebugmenu.h new file mode 100644 index 0000000..ae5af02 --- /dev/null +++ b/src/displays/menus/feedbackdebugmenu.h @@ -0,0 +1,34 @@ +#pragma once + +#include "menudisplay.h" +#include "staticmenudefinition.h" +#include "utils.h" +#include "menuitem.h" +#include "actions/dummyaction.h" +#include "actions/switchscreenaction.h" +#include "icons/back.h" +#include "texts.h" +#include "debugtexthelpers.h" +#include "debugcolorhelpers.h" + +namespace { +class DebugMenu; +} + +namespace { +template class ColorInterface> +class FeedbackDebugMenu : + public MenuDisplay, + public StaticText, + public StaticMenuDefinition< + makeComponent, DummyAction>, + makeComponent, DummyAction>, + makeComponent, DummyAction>, + makeComponent, DummyAction>, + makeComponent, ColorInterface, DummyAction>, + makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>> + > +{}; + +class FrontFeedbackDebugMenu : public FeedbackDebugMenu {}; +class BackFeedbackDebugMenu : public FeedbackDebugMenu {}; } diff --git a/src/displays/menus/genericwifisettingsmenu.h b/src/displays/menus/genericwifisettingsmenu.h new file mode 100644 index 0000000..b9cabb1 --- /dev/null +++ b/src/displays/menus/genericwifisettingsmenu.h @@ -0,0 +1,79 @@ +#pragma once + +#include +#include + +#include "menudisplay.h" +#include "staticmenudefinition.h" +#include "changevaluedisplay.h" +#include "menuitem.h" +#include "actions/dummyaction.h" +#include "actions/toggleboolaction.h" +#include "actions/switchscreenaction.h" +#include "checkboxicon.h" +#include "icons/back.h" +#include "texts.h" + +namespace { +class GenericWifiSettingsMenu; +class WifiSettingsMenu; +} + +namespace { +struct WifiStatusBitsText : public virtual TextInterface { +public: + String text() const override { return String{"statusBits: "} + WiFi.getStatusBits(); } +}; +struct WifiChannelText : public virtual TextInterface { +public: + String text() const override { return String{"channel: "} + WiFi.channel(); } +}; + +struct WifiModeAccessor : public virtual AccessorInterface +{ + wifi_mode_t getValue() const override { return WiFi.getMode(); } + void setValue(wifi_mode_t value) override + { + if (!WiFi.mode(value)) + Serial.println("Could not change WiFi mode!"); + // TODO: better error handling + } +}; +using WifiModeChangeScreen = makeComponent, StaticText, WifiModeAccessor, SwitchScreenAction>; + +struct WifiSleepAccessor : public virtual AccessorInterface +{ + bool getValue() const override { return WiFi.getSleep(); } + void setValue(bool value) override + { + if (!WiFi.setSleep(value)) + Serial.println("Could not set WiFi sleep!"); + // TODO: better error handling + } +}; + +struct WifiTxPowerAccessor : public virtual AccessorInterface +{ + wifi_power_t getValue() const override { return WiFi.getTxPower(); } + void setValue(wifi_power_t value) override + { + if (!WiFi.setTxPower(value)) + Serial.println("Could not set WiFi tx power!"); + // TODO: better error handling + } +}; +using WifiTxPowerChangeScreen = makeComponent, StaticText, WifiTxPowerAccessor, SwitchScreenAction>; + +class GenericWifiSettingsMenu : + public MenuDisplay, + public StaticText, + public StaticMenuDefinition< + makeComponent, + makeComponent, + makeComponent, SwitchScreenAction>, + makeComponent, ToggleBoolAction, CheckboxIcon, WifiSleepAccessor>, + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>> + > +{}; +} diff --git a/src/displays/menus/graphsmenu.h b/src/displays/menus/graphsmenu.h new file mode 100644 index 0000000..1716f03 --- /dev/null +++ b/src/displays/menus/graphsmenu.h @@ -0,0 +1,69 @@ +#pragma once + +#include "menudisplay.h" +#include "staticmenudefinition.h" +#include "utils.h" +#include "actions/switchscreenaction.h" +#include "icons/back.h" +#include "texts.h" +#include "displays/graphdisplay.h" +#include "statistics.h" + +namespace { +class MainMenu; +class DualGraphDisplay; +} + +namespace { +using GasGraphDisplay = makeComponent, StaticText, MultiStatisticsSingleImpl, GasStatistics>; +using BremsGraphDisplay = makeComponent, StaticText, MultiStatisticsSingleImpl, BremsStatistics>; +using AvgSpeedGraphDisplay = makeComponent, StaticText, MultiStatisticsSingleImpl, AvgSpeedStatistics>; +using AvgSpeedKmhGraphDisplay = makeComponent, StaticText, MultiStatisticsSingleImpl, AvgSpeedKmhStatistics>; +using SumCurrentGraphDisplay = makeComponent, StaticText, MultiStatisticsSingleImpl, SumCurrentStatistics>; +using SumAbsoluteCurrentGraphDisplay = makeComponent, StaticText, MultiStatisticsSingleImpl, SumAbsoluteCurrentStatistics>; +using FrontVoltageGraphDisplay = makeComponent, StaticText, MultiStatisticsSingleImpl, FrontVoltageStatistics>; +using BackVoltageGraphDisplay = makeComponent, StaticText, MultiStatisticsSingleImpl, BackVoltageStatistics>; +using BmsVoltageGraphDisplay = makeComponent, StaticText, MultiStatisticsSingleImpl, BmsVoltageStatistics>; +using BmsCurrentGraphDisplay = makeComponent, StaticText, MultiStatisticsSingleImpl, BmsCurrentStatistics>; +using BmsPowerGraphDisplay = makeComponent, StaticText, MultiStatisticsSingleImpl, BmsPowerStatistics>; + +class SumCurrentsComparisonStatistics : public virtual MultiStatisticsInterface<2> +{ + std::array, 2> getBuffers() const override + { + return {SumCurrentStatistics{}.getBuffer(), BmsCurrentStatistics{}.getBuffer()}; + } +}; +using SumCurrentsComparisonGraphDisplay = makeComponent, StaticText, SumCurrentsComparisonStatistics>; + +class MotorCurrentsStatistics : public virtual MultiStatisticsInterface<4> +{ + std::array, 4> getBuffers() const override + { + return {FrontLeftCurrentStatistics{}.getBuffer(), FrontRightCurrentStatistics{}.getBuffer(), BackLeftCurrentStatistics{}.getBuffer(), BackRightCurrentStatistics{}.getBuffer()}; + } +}; +using MotorCurrentsGraphDisplay = makeComponent, StaticText, MotorCurrentsStatistics>; + +class GraphsMenu : + public MenuDisplay, + public StaticText, + public StaticMenuDefinition< + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>> + > +{}; +} diff --git a/src/displays/menus/hardwaresettingsmenu.h b/src/displays/menus/hardwaresettingsmenu.h new file mode 100644 index 0000000..feb13cb --- /dev/null +++ b/src/displays/menus/hardwaresettingsmenu.h @@ -0,0 +1,44 @@ +#pragma once + +#include + +#include "menudisplay.h" +#include "staticmenudefinition.h" +#include "utils.h" +#include "changevaluedisplay.h" +#include "actions/toggleboolaction.h" +#include "actions/switchscreenaction.h" +#include "checkboxicon.h" +#include "icons/back.h" +#include "texts.h" +#include "globals.h" +#include "settingsaccessors.h" + +namespace { +class HardwareSettingsMenu; +class PotiSettingsMenu; +class EnableMenu; +class InvertMenu; +class SettingsMenu; +} + +namespace { +using WheelDiameterMmChangeScreen = makeComponent, StaticText, WheelDiameterMmAccessor, SwitchScreenAction>; +using WheelDiameterInchChangeScreen = makeComponent, StaticText, WheelDiameterInchAccessor, RatioNumberStep>, SwitchScreenAction>; +using NumMagnetPolesChangeScreen = makeComponent, StaticText, NumMagnetPolesAccessor, SwitchScreenAction>; + +class HardwareSettingsMenu : + public MenuDisplay, + public StaticText, + public StaticMenuDefinition< + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction>, + makeComponent, ToggleBoolAction, CheckboxIcon, SwapFrontBackAccessor>, + makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>> + > +{}; +} diff --git a/src/displays/menus/invertmenu.h b/src/displays/menus/invertmenu.h new file mode 100644 index 0000000..244cf0d --- /dev/null +++ b/src/displays/menus/invertmenu.h @@ -0,0 +1,30 @@ +#pragma once + +#include "menudisplay.h" +#include "staticmenudefinition.h" +#include "utils.h" +#include "menuitem.h" +#include "actions/toggleboolaction.h" +#include "actions/switchscreenaction.h" +#include "checkboxicon.h" +#include "icons/back.h" +#include "texts.h" +#include "settingsaccessors.h" + +namespace { +class HardwareSettingsMenu; +} + +namespace { +class InvertMenu : + public MenuDisplay, + public StaticText, + public StaticMenuDefinition< + makeComponent, ToggleBoolAction, CheckboxIcon, FrontLeftInvertedAccessor>, + makeComponent, ToggleBoolAction, CheckboxIcon, FrontRightInvertedAccessor>, + makeComponent, ToggleBoolAction, CheckboxIcon, BackLeftInvertedAccessor>, + makeComponent, ToggleBoolAction, CheckboxIcon, BackRightInvertedAccessor>, + makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>> + > +{}; +} diff --git a/src/displays/menus/larsmmodesettingsmenu.h b/src/displays/menus/larsmmodesettingsmenu.h new file mode 100644 index 0000000..5712dee --- /dev/null +++ b/src/displays/menus/larsmmodesettingsmenu.h @@ -0,0 +1,31 @@ +#pragma once + +#include "menudisplay.h" +#include "staticmenudefinition.h" +#include "utils.h" +#include "changevaluedisplay.h" +#include "menuitem.h" +#include "actions/switchscreenaction.h" +#include "icons/back.h" +#include "texts.h" +#include "settingsaccessors.h" + +namespace { +class LarsmModeSettingsMenu; +class ModesSettingsMenu; +} + +namespace { +using LarsmModeModeChangeDisplay = makeComponent, StaticText, LarsmModeModeAccessor, SwitchScreenAction>; +using LarsmModeIterationsChangeDisplay = makeComponent, StaticText, LarsmModeIterationsAccessor, SwitchScreenAction>; + +class LarsmModeSettingsMenu : + public MenuDisplay, + public StaticText, + public StaticMenuDefinition< + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>> + > +{}; +} diff --git a/src/displays/menus/limitssettingsmenu.h b/src/displays/menus/limitssettingsmenu.h new file mode 100644 index 0000000..5e61243 --- /dev/null +++ b/src/displays/menus/limitssettingsmenu.h @@ -0,0 +1,39 @@ +#pragma once + +#include "menudisplay.h" +#include "staticmenudefinition.h" +#include "utils.h" +#include "changevaluedisplay.h" +#include "menuitem.h" +#include "actions/switchscreenaction.h" +#include "icons/back.h" +#include "texts.h" +#include "settingsaccessors.h" + +namespace { +class LimitsSettingsMenu; +class SettingsMenu; +} + +namespace { +using IMotMaxChangeScreen = makeComponent, StaticText, IMotMaxAccessor, SwitchScreenAction>; +using IDcMaxChangeScreen = makeComponent, StaticText, IDcMaxAccessor, SwitchScreenAction>; +using NMotMaxKmhChangeScreen = makeComponent, StaticText, NMotMaxKmhAccessor, SwitchScreenAction>; +using NMotMaxRpmChangeScreen = makeComponent, StaticText, NMotMaxRpmAccessor, SwitchScreenAction>; +using FieldWeakMaxChangeScreen = makeComponent, StaticText, FieldWeakMaxAccessor, SwitchScreenAction>; +using PhaseAdvMaxChangeScreen = makeComponent, StaticText, PhaseAdvMaxAccessor, SwitchScreenAction>; + +class LimitsSettingsMenu : + public MenuDisplay, + public StaticText, + public StaticMenuDefinition< + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>> + > +{}; +} diff --git a/src/displays/menus/mainmenu.h b/src/displays/menus/mainmenu.h new file mode 100644 index 0000000..ad8608a --- /dev/null +++ b/src/displays/menus/mainmenu.h @@ -0,0 +1,51 @@ +#pragma once + +#include "menudisplay.h" +#include "staticmenudefinition.h" +#include "menuitem.h" +#include "actions/switchscreenaction.h" +#include "actions/rebootaction.h" +#include "texts.h" +#include "icons/back.h" +#include "icons/modes.h" +#include "icons/presets.h" +#include "icons/graph.h" +#include "icons/bms.h" +#include "icons/settings.h" +#include "icons/lock.h" +#include "icons/demos.h" +#include "icons/poweroff.h" +#include "icons/reboot.h" + +namespace { +class StatusDisplay; +class SelectModeMenu; +class PresetsMenu; +class GraphsMenu; +class BmsMenu; +class SettingsMenu; +class Lockscreen; +class DemosMenu; +class PoweroffDisplay; +class DebugMenu; +} + +namespace { +class MainMenu : + public MenuDisplay, + public StaticText, + public StaticMenuDefinition< + makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>>, + makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::modes>>, + makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::presets>>, + makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::graph>>, + makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::bms>>, + makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::settings>>, + makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::lock>>, + makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::demos>>, + makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::poweroff>>, + makeComponent, RebootAction, StaticMenuItemIcon<&icons::reboot>>, + makeComponent, SwitchScreenAction> + > +{}; +}; diff --git a/src/displays/menus/modessettingsmenu.h b/src/displays/menus/modessettingsmenu.h new file mode 100644 index 0000000..c542c0f --- /dev/null +++ b/src/displays/menus/modessettingsmenu.h @@ -0,0 +1,28 @@ +#pragma once + +#include "menudisplay.h" +#include "staticmenudefinition.h" +#include "menuitem.h" +#include "actions/switchscreenaction.h" +#include "icons/back.h" +#include "texts.h" + +namespace { +class DefaultModeSettingsMenu; +class TempomatModeSettingsMenu; +class LarsmModeSettingsMenu; +class SettingsMenu; +} + +namespace { +class ModesSettingsMenu : + public MenuDisplay, + public StaticText, + public StaticMenuDefinition< + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>> + > +{}; +} diff --git a/src/displays/menus/motorfeedbackdebugmenu.h b/src/displays/menus/motorfeedbackdebugmenu.h new file mode 100644 index 0000000..5f78b11 --- /dev/null +++ b/src/displays/menus/motorfeedbackdebugmenu.h @@ -0,0 +1,40 @@ +#pragma once + +#include "menudisplay.h" +#include "staticmenudefinition.h" +#include "utils.h" +#include "menuitem.h" +#include "actions/dummyaction.h" +#include "actions/switchscreenaction.h" +#include "icons/back.h" +#include "texts.h" +#include "debugtexthelpers.h" +#include "debugcolorhelpers.h" + +namespace { +class DebugMenu; +} + +namespace { +template class ColorInterface> +class MotorFeedbackDebugMenu : + public MenuDisplay, + public StaticText, + public StaticMenuDefinition< + makeComponent, DummyAction>, + makeComponent, DummyAction>, + makeComponent, DummyAction>, + makeComponent, DummyAction>, + makeComponent, DummyAction>, + makeComponent, DummyAction>, + makeComponent, DummyAction>, + makeComponent, DummyAction>, + makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>> + > +{}; + +class FrontLeftMotorFeedbackDebugMenu : public MotorFeedbackDebugMenu {}; +class FrontRightMotorFeedbackDebugMenu : public MotorFeedbackDebugMenu {}; +class BackLeftMotorFeedbackDebugMenu : public MotorFeedbackDebugMenu {}; +class BackRightMotorFeedbackDebugMenu : public MotorFeedbackDebugMenu {}; +} diff --git a/src/displays/menus/motorstatedebugmenu.h b/src/displays/menus/motorstatedebugmenu.h new file mode 100644 index 0000000..951ebfc --- /dev/null +++ b/src/displays/menus/motorstatedebugmenu.h @@ -0,0 +1,40 @@ +#pragma once + +#include "menudisplay.h" +#include "staticmenudefinition.h" +#include "utils.h" +#include "menuitem.h" +#include "actions/dummyaction.h" +#include "actions/switchscreenaction.h" +#include "icons/back.h" +#include "texts.h" +#include "debugtexthelpers.h" + +namespace { +class DebugMenu; +} + +namespace { +template +class MotorStateDebugMenu : + public MenuDisplay, + public StaticText, + public StaticMenuDefinition< + makeComponent, + makeComponent, + makeComponent, + makeComponent, + makeComponent, + makeComponent, + makeComponent, + makeComponent, + makeComponent, + makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>> + > +{}; + +class FrontLeftMotorStateDebugMenu : public MotorStateDebugMenu {}; +class FrontRightMotorStateDebugMenu : public MotorStateDebugMenu {}; +class BackLeftMotorStateDebugMenu : public MotorStateDebugMenu {}; +class BackRightMotorStateDebugMenu : public MotorStateDebugMenu {}; +} diff --git a/src/displays/menus/potisettingsmenu.h b/src/displays/menus/potisettingsmenu.h new file mode 100644 index 0000000..d570e58 --- /dev/null +++ b/src/displays/menus/potisettingsmenu.h @@ -0,0 +1,50 @@ +#pragma once + +#include "menudisplay.h" +#include "staticmenudefinition.h" +#include "utils.h" +#include "changevaluedisplay.h" +#include "actions/dummyaction.h" +#include "actions/switchscreenaction.h" +#include "icons/back.h" +#include "texts.h" +#include "settingsaccessors.h" + +namespace { +class PotiSettingsMenu; +class CalibrateDisplay; +class HardwareSettingsMenu; +} + +namespace { +struct GasText : public virtual TextInterface { +public: + String text() const override { return String{"gas: "} + raw_gas + ": " + gas; } +}; +struct BremsText : public virtual TextInterface { +public: + String text() const override { return String{"brems: "} + raw_brems + ": " + brems; } +}; + +using SampleCountChangeScreen = makeComponent, StaticText, SampleCountAccessor, SwitchScreenAction>; +using GasMinChangeScreen = makeComponent, StaticText, GasMinAccessor, SwitchScreenAction>; +using GasMaxChangeScreen = makeComponent, StaticText, GasMaxAccessor, SwitchScreenAction>; +using BremsMinChangeScreen = makeComponent, StaticText, BremsMinAccessor, SwitchScreenAction>; +using BremsMaxChangeScreen = makeComponent, StaticText, BremsMaxAccessor, SwitchScreenAction>; + +class PotiSettingsMenu : + public MenuDisplay, + public StaticText, + public StaticMenuDefinition< + makeComponent, DummyAction>, + makeComponent, DummyAction>, + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>> + > +{}; +} diff --git a/src/displays/menus/presetsmenu.h b/src/displays/menus/presetsmenu.h new file mode 100644 index 0000000..80dd806 --- /dev/null +++ b/src/displays/menus/presetsmenu.h @@ -0,0 +1,48 @@ +#pragma once + +#include "actioninterface.h" +#include "menudisplay.h" +#include "staticmenudefinition.h" +#include "utils.h" +#include "actions/dummyaction.h" +#include "actions/switchscreenaction.h" +#include "icons/back.h" +#include "texts.h" +#include "settings.h" +#include "presets.h" +#include "globals.h" + +namespace { +class MainMenu; +} + +namespace { +template +class ApplyPresetAction : public virtual ActionInterface {public: void triggered() override { settings = *preset; saveSettings(); } }; + +template +class ApplyLimitsPresetAction : public virtual ActionInterface {public: void triggered() override { settings.limits = *preset; saveSettings(); } }; + +template +class ApplyPotiPresetAction : public virtual ActionInterface {public: void triggered() override { settings.hardware.poti = *preset; saveSettings(); } }; + +template +class ApplyHardwarePresetAction : public virtual ActionInterface {public: void triggered() override { settings.hardware = *preset; saveSettings(); } }; + +class PresetsMenu : + public MenuDisplay, + public StaticText, + public StaticMenuDefinition< + makeComponent, ApplyPresetAction<&presets::defaultSettings>>, + makeComponent, ApplyLimitsPresetAction<&presets::defaultLimits>>, + makeComponent, ApplyLimitsPresetAction<&presets::kidsLimits>>, + makeComponent, ApplyPotiPresetAction<&presets::defaultPoti>>, + makeComponent, ApplyHardwarePresetAction<&presets::defaultHardware>>, + makeComponent, DisabledColor, DummyAction>, + makeComponent, DisabledColor, DummyAction>, + makeComponent, DisabledColor, DummyAction>, + makeComponent, DisabledColor, DummyAction>, + makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>> + > +{}; +} diff --git a/src/displays/menus/selectmodemenu.h b/src/displays/menus/selectmodemenu.h new file mode 100644 index 0000000..0c40731 --- /dev/null +++ b/src/displays/menus/selectmodemenu.h @@ -0,0 +1,63 @@ +#pragma once + +#include "menudisplay.h" +#include "staticmenudefinition.h" +#include "utils.h" +#include "actions/multiaction.h" +#include "actions/switchscreenaction.h" +#include "icons/back.h" +#include "texts.h" +#include "globals.h" + +#include "modes/defaultmode.h" +#include "modes/tempomatmode.h" +#include "modes/larsmmode.h" + +namespace { +class MainMenu; +} + +namespace { +template +class SetterAction : public ActionInterface +{ +public: + void triggered() override { target = value; } +}; +using SetDefaultModeAction = SetterAction; +using SetTempomatModeAction = SetterAction; +using SetLarsmModeAction = SetterAction; + +class SelectModeMenu : + public MenuDisplay, + public StaticText, + public StaticMenuDefinition< + makeComponent, MultiAction>>, + makeComponent, MultiAction>>, + makeComponent, MultiAction>>, + makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>> + > +{ + using Base = MenuDisplay; + +public: + void start() override; +}; + +void SelectModeMenu::start() +{ + Base::start(); + + if (currentMode == &modes::defaultMode) + setSelectedIndex(0); + else if (currentMode == &modes::tempomatMode) + setSelectedIndex(1); + else if (currentMode == &modes::larsmMode) + setSelectedIndex(2); + else + { + Serial.printf("Unknown mode: %s", currentMode?currentMode->displayName():""); + setSelectedIndex(3); + } +} +} diff --git a/src/displays/menus/settingsmenu.h b/src/displays/menus/settingsmenu.h new file mode 100644 index 0000000..26a3bf8 --- /dev/null +++ b/src/displays/menus/settingsmenu.h @@ -0,0 +1,53 @@ +#pragma once + +#include + +#include "menudisplay.h" +#include "staticmenudefinition.h" +#include "utils.h" +#include "actions/toggleboolaction.h" +#include "actions/switchscreenaction.h" +#include "checkboxicon.h" +#include "icons/wifi.h" +#include "icons/bluetooth.h" +#include "icons/hardware.h" +#include "icons/buzzer.h" +#include "icons/info.h" +#include "icons/back.h" +#include "texts.h" +#include "globals.h" +#include "settingsaccessors.h" + +namespace { +class LimitsSettingsMenu; +class WifiSettingsMenu; +class BluetoothSettingsMenu; +class ModesSettingsMenu; +class HardwareSettingsMenu; +class BuzzerMenu; +class AboutMenu; +class MainMenu; +} + +namespace { +struct FrontLedAccessor : public RefAccessor { bool &getRef() const override { return front.command.led; } }; +struct BackLedAccessor : public RefAccessor { bool &getRef() const override { return back.command.led; } }; + +class SettingsMenu : + public MenuDisplay, + public StaticText, + public StaticMenuDefinition< + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::wifi>>, + makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::bluetooth>>, + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::hardware>>, + makeComponent, ToggleBoolAction, CheckboxIcon, AutoConnectBmsAccessor>, + makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::buzzer>>, + makeComponent, ToggleBoolAction, CheckboxIcon, FrontLedAccessor>, + makeComponent, ToggleBoolAction, CheckboxIcon, BackLedAccessor>, + makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::info>>, + makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>> + > +{}; +} diff --git a/src/displays/menus/stationwifisettingsmenu.h b/src/displays/menus/stationwifisettingsmenu.h new file mode 100644 index 0000000..3b5aa16 --- /dev/null +++ b/src/displays/menus/stationwifisettingsmenu.h @@ -0,0 +1,140 @@ +#pragma once + +#include + +#include "menudisplay.h" +#include "staticmenudefinition.h" +#include "utils.h" +#include "menuitem.h" +#include "actions/dummyaction.h" +#include "actions/switchscreenaction.h" +#include "actions/wifireconnectaction.h" +#include "actions/wifidisconnectaction.h" +#include "actions/toggleboolaction.h" +#include "actions/wifienableipv6action.h" +#include "checkboxicon.h" +#include "icons/back.h" +#include "texts.h" + +namespace { +class WifiSettingsMenu; +} + +namespace { +struct WifiIsConnectedText : public virtual TextInterface { +public: + String text() const override { return String{"isConnected: "} + (WiFi.isConnected() ? "true" : "false"); } +}; + +struct WifiAutoConnectAccessor : public virtual AccessorInterface +{ + bool getValue() const override { return WiFi.getAutoConnect(); } + void setValue(bool value) override + { + if (!WiFi.setAutoConnect(value)) + Serial.println("Could not set WiFi autoConnect!"); + // TODO: better error handling + } +}; + +struct WifiAutoReconnectAccessor : public virtual AccessorInterface +{ + bool getValue() const override { return WiFi.getAutoReconnect(); } + void setValue(bool value) override + { + if (!WiFi.setAutoReconnect(value)) + Serial.println("Could not set WiFi autoReconnect!"); + // TODO: better error handling + } +}; + +struct WifiLocalIpText : public virtual TextInterface { +public: + String text() const override { return String{"localIP: "} + WiFi.localIP().toString(); } +}; +struct WifiMacAddressText : public virtual TextInterface { +public: + String text() const override { return String{"macAddress: "} + WiFi.macAddress(); } +}; +struct WifiSubnetMaskText : public virtual TextInterface { +public: + String text() const override { return String{"subnetMask: "} + WiFi.subnetMask().toString(); } +}; +struct WifiGatewayIpText : public virtual TextInterface { +public: + String text() const override { return String{"gatewayIP: "} + WiFi.gatewayIP().toString(); } +}; +struct WifiDnsIpText : public virtual TextInterface { +public: + String text() const override { return String{"dnsIP: "} + WiFi.dnsIP().toString(); } +}; +struct WifiBroadcastIpText : public virtual TextInterface { +public: + String text() const override { return String{"broadcastIP: "} + WiFi.broadcastIP().toString(); } +}; +struct WifiNetworkIdText : public virtual TextInterface { +public: + String text() const override { return String{"networkID: "} + WiFi.networkID().toString(); } +}; +struct WifiSubnetCIDRText : public virtual TextInterface { +public: + String text() const override { return String{"subnetCIDR: "} + WiFi.subnetCIDR(); } +}; +struct WifiLocalIpV6Text : public virtual TextInterface { +public: + String text() const override { return String{"localIPv6: "} + WiFi.localIPv6().toString(); } +}; +struct WifiHostnameText : public virtual TextInterface { +public: + String text() const override { return String{"hostname: "} + WiFi.getHostname(); } +}; +struct WifiStatusText : public virtual TextInterface { +public: + String text() const override { return String{"status: "} + toString(WiFi.status()); } +}; +struct WifiSsidText : public virtual TextInterface { +public: + String text() const override { return String{"SSID: "} + WiFi.SSID(); } +}; +struct WifiPskText : public virtual TextInterface { +public: + String text() const override { return String{"psk: "} + WiFi.psk(); } +}; +struct WifiBssidText : public virtual TextInterface { +public: + String text() const override { return String{"BSSID: "} + WiFi.BSSIDstr(); } +}; +struct WifiRssiText : public virtual TextInterface { +public: + String text() const override { return String{"RSSI: "} + WiFi.RSSI(); } +}; + +class StationWifiSettingsMenu : + public MenuDisplay, + public StaticText, + public StaticMenuDefinition< + makeComponent, WifiReconnectAction>, + makeComponent, WifiDisconnectAction>, + makeComponent, DisabledColor, DummyAction>, + makeComponent, ToggleBoolAction, CheckboxIcon, WifiAutoConnectAccessor>, + makeComponent, ToggleBoolAction, CheckboxIcon, WifiAutoReconnectAccessor>, + makeComponent, DisabledColor, DummyAction>, + makeComponent, DisabledColor, DummyAction>, + makeComponent, DisabledColor, DummyAction>, + makeComponent, DisabledColor, DummyAction>, + makeComponent, DisabledColor, DummyAction>, + makeComponent, DisabledColor, DummyAction>, + makeComponent, DisabledColor, DummyAction>, + makeComponent, DisabledColor, DummyAction>, + makeComponent, WifiEnableIpV6Action>, + makeComponent, DisabledColor, DummyAction>, + makeComponent, DisabledColor, DummyAction>, + makeComponent, DisabledColor, DummyAction>, + makeComponent, DisabledColor, DummyAction>, + makeComponent, DisabledColor, DummyAction>, + makeComponent, DisabledColor, DummyAction>, + makeComponent, DisabledColor, DummyAction>, + makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>> + > +{}; +} diff --git a/src/displays/menus/tempomatmodesettingsmenu.h b/src/displays/menus/tempomatmodesettingsmenu.h new file mode 100644 index 0000000..bae2ccb --- /dev/null +++ b/src/displays/menus/tempomatmodesettingsmenu.h @@ -0,0 +1,31 @@ +#pragma once + +#include "menudisplay.h" +#include "staticmenudefinition.h" +#include "utils.h" +#include "changevaluedisplay.h" +#include "menuitem.h" +#include "actions/switchscreenaction.h" +#include "icons/back.h" +#include "texts.h" +#include "settingsaccessors.h" + +namespace { +class TempomatModeSettingsMenu; +class ModesSettingsMenu; +} + +namespace { +using TempomatModeCtrlTypChangeScreen = makeComponent, StaticText, TempomatModeCtrlTypAccessor, SwitchScreenAction>; +using TempomatModeCtrlModChangeScreen = makeComponent, StaticText, TempomatModeCtrlModAccessor, SwitchScreenAction>; + +class TempomatModeSettingsMenu : + public MenuDisplay, + public StaticText, + public StaticMenuDefinition< + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>> + > +{}; +} diff --git a/src/displays/menus/wifiscanmenu.h b/src/displays/menus/wifiscanmenu.h new file mode 100644 index 0000000..08a1ddc --- /dev/null +++ b/src/displays/menus/wifiscanmenu.h @@ -0,0 +1,109 @@ +#pragma once + +#include + +#include +#include + +#include "menudisplay.h" +#include "utils.h" +#include "actions/multiaction.h" +#include "actions/switchscreenaction.h" +#include "actions/dummyaction.h" +#include "icons/back.h" +#include "texts.h" + +namespace { +class WifiSettingsMenu; +} + +namespace { +class WifiScanMenu : public MenuDisplay +{ + using Base = MenuDisplay; + +public: + String text() const override; + + void start() override; + void update() override; + void stop() override; + + void runForEveryMenuItem(std::function &&callback) override + { + for (auto &item : vec) + callback(item); + callback(m_backItem); + } + +private: + makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>> m_backItem; + + std::vector> vec; + + unsigned long m_lastScanComplete; +}; + +String WifiScanMenu::text() const +{ + auto text = String{vec.size()} + " found"; + switch (WiFi.scanComplete()) + { + case WIFI_SCAN_RUNNING: text += " (scanning)"; break; + case WIFI_SCAN_FAILED: text += " (error)"; break; + } + return text; +} + +void WifiScanMenu::start() +{ + Base::start(); + + m_lastScanComplete = 0; + + WiFi.scanNetworks(true); +} + +void WifiScanMenu::update() +{ + const auto n = WiFi.scanComplete(); + if (n >= 0) + { + if (n != vec.size()) + { + while (n > vec.size()) + { + vec.emplace_back(); + vec.back().start(); + } + + while (n < vec.size()) + { + vec.back().stop(); + vec.pop_back(); + } + } + + const auto now = millis(); + if (!m_lastScanComplete) + { + for (auto iter = std::begin(vec); iter != std::end(vec); iter++) + iter->setTitle(WiFi.SSID(std::distance(std::begin(vec), iter))); + + m_lastScanComplete = now; + } + else if (now - m_lastScanComplete >= 2000) + { + m_lastScanComplete = 0; + WiFi.scanNetworks(true); + } + } + + Base::update(); +} + +void WifiScanMenu::stop() +{ + WiFi.scanDelete(); +} +} diff --git a/src/displays/menus/wifisettingsmenu.h b/src/displays/menus/wifisettingsmenu.h new file mode 100644 index 0000000..b9452b5 --- /dev/null +++ b/src/displays/menus/wifisettingsmenu.h @@ -0,0 +1,31 @@ +#pragma once + +#include "menudisplay.h" +#include "staticmenudefinition.h" +#include "utils.h" +#include "actions/switchscreenaction.h" +#include "icons/scan.h" +#include "icons/back.h" +#include "texts.h" + +namespace { +class GenericWifiSettingsMenu; +class StationWifiSettingsMenu; +class WifiScanMenu; +class AccessPointWifiSettingsMenu; +class SettingsMenu; +} + +namespace { +class WifiSettingsMenu : + public MenuDisplay, + public StaticText, + public StaticMenuDefinition< + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::scan>>, + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>> + > +{}; +} diff --git a/src/displays/metersdisplay.h b/src/displays/metersdisplay.h new file mode 100644 index 0000000..b390c76 --- /dev/null +++ b/src/displays/metersdisplay.h @@ -0,0 +1,281 @@ +#pragma once + +#include + +#include + +#include "demodisplay.h" +#include "actions/switchscreenaction.h" +#include "globals.h" +#include "utils.h" + +namespace { +class MainMenu; +class StatusDisplay; +class BmsDisplay; +} + +namespace { +class MetersDisplay : public DemoDisplay, public SwitchScreenAction +{ + using Base = DemoDisplay; + +public: + void initScreen() override; + void redraw() override; + + void rotate(int offset) override; + +private: + // Draw the analogue meter on the screen + void analogMeter(); + + // Update needle position + void plotNeedle(float value); + + // Draw a linear meter on the screen + void plotLinear(const char *label, int x, int y); + + // Adjust 6 linear meter pointer positions + void plotPointer(); + + static const constexpr auto TFT_GREY = 0x5AEB; + + float ltx = 0; // Saved x coord of bottom of needle + uint16_t osx = 120, osy = 120; // Saved x & y coords + + struct ValuePair { + int value = 0, + old_value = -1; + }; + std::array values; + + int d = 0; +}; + +void MetersDisplay::initScreen() +{ + tft.fillScreen(TFT_BLACK); + + analogMeter(); // Draw analogue meter + + // Draw 6 linear meters + byte d = 40; + plotLinear("A0", 0, 160); + plotLinear("A1", 1 * d, 160); + plotLinear("A2", 2 * d, 160); + plotLinear("A3", 3 * d, 160); + plotLinear("A4", 4 * d, 160); + plotLinear("A5", 5 * d, 160); +} + +void MetersDisplay::redraw() +{ + d += 4; if (d >= 360) d = 0; + + // Create a Sine wave for testing + for (auto iter = std::begin(values); iter != std::end(values); iter++) + iter->value = 50 + 50 * sin((d + (std::distance(std::begin(values), iter) * 60)) * 0.0174532925); + + plotPointer(); + + plotNeedle(avgSpeedKmh); +} + +void MetersDisplay::rotate(int offset) +{ + if (offset < 0) + switchScreen(); + else if (offset > 0) + switchScreen(); +} + +void MetersDisplay::analogMeter() +{ + // Meter outline + tft.fillRect(0, 0, 239, 126, TFT_GREY); + tft.fillRect(5, 3, 230, 119, TFT_WHITE); + + tft.setTextColor(TFT_BLACK); // Text colour + + // Draw ticks every 5 degrees from -50 to +50 degrees (100 deg. FSD swing) + for (int i = -50; i < 51; i += 5) { + // Long scale tick length + int tl = 15; + + // Coodinates of tick to draw + float sx = cos((i - 90) * 0.0174532925); + float sy = sin((i - 90) * 0.0174532925); + uint16_t x0 = sx * (100 + tl) + 120; + uint16_t y0 = sy * (100 + tl) + 140; + uint16_t x1 = sx * 100 + 120; + uint16_t y1 = sy * 100 + 140; + + // Coordinates of next tick for zone fill + float sx2 = cos((i + 5 - 90) * 0.0174532925); + float sy2 = sin((i + 5 - 90) * 0.0174532925); + int x2 = sx2 * (100 + tl) + 120; + int y2 = sy2 * (100 + tl) + 140; + int x3 = sx2 * 100 + 120; + int y3 = sy2 * 100 + 140; + + // Yellow zone limits + //if (i >= -50 && i < 0) { + // tft.fillTriangle(x0, y0, x1, y1, x2, y2, TFT_YELLOW); + // tft.fillTriangle(x1, y1, x2, y2, x3, y3, TFT_YELLOW); + //} + + // Green zone limits + if (i >= 0 && i < 25) { + tft.fillTriangle(x0, y0, x1, y1, x2, y2, TFT_GREEN); + tft.fillTriangle(x1, y1, x2, y2, x3, y3, TFT_GREEN); + } + + // Orange zone limits + if (i >= 25 && i < 50) { + tft.fillTriangle(x0, y0, x1, y1, x2, y2, TFT_ORANGE); + tft.fillTriangle(x1, y1, x2, y2, x3, y3, TFT_ORANGE); + } + + // Short scale tick length + if (i % 25 != 0) tl = 8; + + // Recalculate coords incase tick lenght changed + x0 = sx * (100 + tl) + 120; + y0 = sy * (100 + tl) + 140; + x1 = sx * 100 + 120; + y1 = sy * 100 + 140; + + // Draw tick + tft.drawLine(x0, y0, x1, y1, TFT_BLACK); + + // Check if labels should be drawn, with position tweaks + if (i % 25 == 0) { + // Calculate label positions + x0 = sx * (100 + tl + 10) + 120; + y0 = sy * (100 + tl + 10) + 140; + switch (i / 25) { + case -2: tft.drawCentreString("0", x0, y0 - 12, 2); break; + case -1: tft.drawCentreString("7.5", x0, y0 - 9, 2); break; + case 0: tft.drawCentreString("15", x0, y0 - 6, 2); break; + case 1: tft.drawCentreString("22.5", x0, y0 - 9, 2); break; + case 2: tft.drawCentreString("30", x0, y0 - 12, 2); break; + } + } + + // Now draw the arc of the scale + sx = cos((i + 5 - 90) * 0.0174532925); + sy = sin((i + 5 - 90) * 0.0174532925); + x0 = sx * 100 + 120; + y0 = sy * 100 + 140; + // Draw scale arc, don't draw the last part + if (i < 50) tft.drawLine(x0, y0, x1, y1, TFT_BLACK); + } + + tft.drawString("KM/h", 5 + 230 - 40, 119 - 20, 2); // Units at bottom right + tft.drawCentreString("KM/h", 120, 70, 4); // Comment out to avoid font 4 + tft.drawRect(5, 3, 230, 119, TFT_BLACK); // Draw bezel line + + plotNeedle(0.f); // Put meter needle at 0 +} + +void MetersDisplay::plotNeedle(float value) +{ + tft.setTextColor(TFT_BLACK, TFT_WHITE); + char buf[8]; dtostrf(value, 4, 0, buf); + tft.drawRightString(buf, 50, 119 - 25, 4); + + if (value < -3) value = -3; // Limit value to emulate needle end stops + if (value > 33) value = 33; + + float sdeg = map(value, -3, 33, -150, -30); // Map value to angle + // Calcualte tip of needle coords + float sx = cos(sdeg * 0.0174532925); + float sy = sin(sdeg * 0.0174532925); + + // Calculate x delta of needle start (does not start at pivot point) + float tx = tan((sdeg + 90) * 0.0174532925); + + // Erase old needle image + tft.drawLine(120 + 20 * ltx - 1, 140 - 20, osx - 1, osy, TFT_WHITE); + tft.drawLine(120 + 20 * ltx, 140 - 20, osx, osy, TFT_WHITE); + tft.drawLine(120 + 20 * ltx + 1, 140 - 20, osx + 1, osy, TFT_WHITE); + + // Re-plot text under needle + tft.setTextColor(TFT_BLACK); + tft.drawCentreString("KM/h", 120, 70, 4); // // Comment out to avoid font 4 + + // Store new needle end coords for next erase + ltx = tx; + osx = sx * 98 + 120; + osy = sy * 98 + 140; + + // Draw the needle in the new postion, magenta makes needle a bit bolder + // draws 3 lines to thicken needle + tft.drawLine(120 + 20 * ltx - 1, 140 - 20, osx - 1, osy, TFT_RED); + tft.drawLine(120 + 20 * ltx, 140 - 20, osx, osy, TFT_MAGENTA); + tft.drawLine(120 + 20 * ltx + 1, 140 - 20, osx + 1, osy, TFT_RED); +} + +void MetersDisplay::plotLinear(const char *label, int x, int y) +{ + int w = 36; + tft.drawRect(x, y, w, 155, TFT_GREY); + tft.fillRect(x + 2, y + 19, w - 3, 155 - 38, TFT_WHITE); + tft.setTextColor(TFT_CYAN, TFT_BLACK); + tft.drawCentreString(label, x + w / 2, y + 2, 2); + + for (int i = 0; i < 110; i += 10) + { + tft.drawFastHLine(x + 20, y + 27 + i, 6, TFT_BLACK); + } + + for (int i = 0; i < 110; i += 50) + { + tft.drawFastHLine(x + 20, y + 27 + i, 9, TFT_BLACK); + } + + tft.fillTriangle(x + 3, y + 127, x + 3 + 16, y + 127, x + 3, y + 127 - 5, TFT_RED); + tft.fillTriangle(x + 3, y + 127, x + 3 + 16, y + 127, x + 3, y + 127 + 5, TFT_RED); + + tft.drawCentreString("---", x + w / 2, y + 155 - 18, 2); +} + +void MetersDisplay::plotPointer() +{ + int dy = 187; + byte pw = 16; + + tft.setTextColor(TFT_GREEN, TFT_BLACK); + + // Move the 6 pointers one pixel towards new value + for (auto iter = std::begin(values); iter != std::end(values); iter++) + { + const auto i = std::distance(std::begin(values), iter); + + char buf[8]; + dtostrf(iter->value, 4, 0, buf); + tft.drawRightString(buf, i * 40 + 36 - 5, 187 - 27 + 155 - 18, 2); + + int dx = 3 + 40 * i; + if (iter->value < 0) iter->value = 0; // Limit value to emulate needle end stops + if (iter->value > 100) iter->value = 100; + + while (!(iter->value == iter->old_value)) { + dy = 187 + 100 - iter->old_value; + if (iter->old_value > iter->value) + { + tft.drawLine(dx, dy - 5, dx + pw, dy, TFT_WHITE); + iter->old_value--; + tft.drawLine(dx, dy + 6, dx + pw, dy + 1, TFT_RED); + } + else + { + tft.drawLine(dx, dy + 5, dx + pw, dy, TFT_WHITE); + iter->old_value++; + tft.drawLine(dx, dy - 6, dx + pw, dy - 1, TFT_RED); + } + } + } +} +} diff --git a/src/displays/pingpongdisplay.h b/src/displays/pingpongdisplay.h new file mode 100644 index 0000000..192ef6f --- /dev/null +++ b/src/displays/pingpongdisplay.h @@ -0,0 +1,236 @@ +#pragma once + +#include + +#include +#include + +#include "demodisplay.h" +#include "actions/switchscreenaction.h" + +namespace { +class DemosMenu; +} + +namespace { +class PingPongDisplay : public DemoDisplay, public SwitchScreenAction +{ + using Base = DemoDisplay; + +public: + PingPongDisplay(); + + void initScreen() override; + void redraw() override; + void stop() override; + +private: + void midline(); + void lpaddle(); + void rpaddle(); + void calc_target_y(); + void ball(); + + int16_t h = 240; + int16_t w = 320; + + int dly = 5; + + int16_t paddle_h = 30; + int16_t paddle_w = 4; + + int16_t lpaddle_x = 0; + int16_t rpaddle_x = w - paddle_w; + + int16_t lpaddle_y = 0; + int16_t rpaddle_y = h - paddle_h; + + int16_t lpaddle_d = 1; + int16_t rpaddle_d = -1; + + int16_t lpaddle_ball_t = w - w / 4; + int16_t rpaddle_ball_t = w / 4; + + int16_t target_y = 0; + + int16_t ball_x = 2; + int16_t ball_y = 2; + int16_t oldball_x = 2; + int16_t oldball_y = 2; + + int16_t ball_dx = 1; + int16_t ball_dy = 1; + + int16_t ball_w = 6; + int16_t ball_h = 6; + + int16_t dashline_h = 4; + int16_t dashline_w = 2; + int16_t dashline_n = h / dashline_h; + int16_t dashline_x = w / 2 - 1; + int16_t dashline_y = dashline_h / 2; + + int16_t lscore = 12; + int16_t rscore = 4; + + static const constexpr auto BLACK = 0x0000; + static const constexpr auto WHITE = 0xFFFF; + static const constexpr auto GREY = 0x5AEB; +}; + +PingPongDisplay::PingPongDisplay() : + lpaddle_y(random(0, h - paddle_h)), + rpaddle_y(random(0, h - paddle_h)), + // ball is placed on the center of the left paddle + ball_y(lpaddle_y + (paddle_h / 2)) +{ + calc_target_y(); +} + +void PingPongDisplay::initScreen() +{ + tft.fillScreen(TFT_BLACK); + tft.setRotation(1); + + midline(); +} + +void PingPongDisplay::redraw() +{ + lpaddle(); + rpaddle(); + + midline(); + + ball(); +} + +void PingPongDisplay::stop() +{ + tft.setRotation(0); +} + +void PingPongDisplay::midline() +{ + // If the ball is not on the line then don't redraw the line + if ((ball_x dashline_x+dashline_w)) return; + + tft.startWrite(); + + // Quick way to draw a dashed line + tft.setAddrWindow(dashline_x, 0, dashline_w, h); + + for(int16_t i = 0; i < dashline_n; i+=2) { + tft.pushColor(WHITE, dashline_w*dashline_h); // push dash pixels + tft.pushColor(BLACK, dashline_w*dashline_h); // push gap pixels + } + + tft.endWrite(); +} + +void PingPongDisplay::lpaddle() +{ + if (lpaddle_d == 1) + { + tft.fillRect(lpaddle_x, lpaddle_y, paddle_w, 1, BLACK); + } + else if (lpaddle_d == -1) + { + tft.fillRect(lpaddle_x, lpaddle_y + paddle_h - 1, paddle_w, 1, BLACK); + } + + lpaddle_y = lpaddle_y + lpaddle_d; + + if (ball_dx == 1) + lpaddle_d = 0; + else + { + if (lpaddle_y + paddle_h / 2 == target_y) lpaddle_d = 0; + else if (lpaddle_y + paddle_h / 2 > target_y) lpaddle_d = -1; + else lpaddle_d = 1; + } + + if (lpaddle_y + paddle_h >= h && lpaddle_d == 1) lpaddle_d = 0; + else if (lpaddle_y <= 0 && lpaddle_d == -1) lpaddle_d = 0; + + tft.fillRect(lpaddle_x, lpaddle_y, paddle_w, paddle_h, WHITE); +} + +void PingPongDisplay::rpaddle() +{ + if (rpaddle_d == 1) { + tft.fillRect(rpaddle_x, rpaddle_y, paddle_w, 1, BLACK); + } + else if (rpaddle_d == -1) { + tft.fillRect(rpaddle_x, rpaddle_y + paddle_h - 1, paddle_w, 1, BLACK); + } + + rpaddle_y = rpaddle_y + rpaddle_d; + + if (ball_dx == -1) rpaddle_d = 0; + else { + if (rpaddle_y + paddle_h / 2 == target_y) rpaddle_d = 0; + else if (rpaddle_y + paddle_h / 2 > target_y) rpaddle_d = -1; + else rpaddle_d = 1; + } + + if (rpaddle_y + paddle_h >= h && rpaddle_d == 1) rpaddle_d = 0; + else if (rpaddle_y <= 0 && rpaddle_d == -1) rpaddle_d = 0; + + tft.fillRect(rpaddle_x, rpaddle_y, paddle_w, paddle_h, WHITE); +} + +void PingPongDisplay::calc_target_y() +{ + int16_t target_x; + int16_t reflections; + int16_t y; + + if (ball_dx == 1) { + target_x = w - ball_w; + } + else { + target_x = -1 * (w - ball_w); + } + + y = abs(target_x * (ball_dy / ball_dx) + ball_y); + + reflections = floor(y / h); + + if (reflections % 2 == 0) { + target_y = y % h; + } + else { + target_y = h - (y % h); + } +} + +void PingPongDisplay::ball() +{ + ball_x = ball_x + ball_dx; + ball_y = ball_y + ball_dy; + + if (ball_dx == -1 && ball_x == paddle_w && ball_y + ball_h >= lpaddle_y && ball_y <= lpaddle_y + paddle_h) { + ball_dx = ball_dx * -1; + dly = random(5); // change speed of ball after paddle contact + calc_target_y(); + } else if (ball_dx == 1 && ball_x + ball_w == w - paddle_w && ball_y + ball_h >= rpaddle_y && ball_y <= rpaddle_y + paddle_h) { + ball_dx = ball_dx * -1; + dly = random(5); // change speed of ball after paddle contact + calc_target_y(); + } else if ((ball_dx == 1 && ball_x >= w) || (ball_dx == -1 && ball_x + ball_w < 0)) { + dly = 5; + } + + if (ball_y > h - ball_w || ball_y < 0) { + ball_dy = ball_dy * -1; + ball_y += ball_dy; // Keep in bounds + } + + //tft.fillRect(oldball_x, oldball_y, ball_w, ball_h, BLACK); + tft.drawRect(oldball_x, oldball_y, ball_w, ball_h, BLACK); // Less TFT refresh aliasing than line above for large balls + tft.fillRect( ball_x, ball_y, ball_w, ball_h, WHITE); + oldball_x = ball_x; + oldball_y = ball_y; +} +} diff --git a/src/displays/poweroffdisplay.h b/src/displays/poweroffdisplay.h new file mode 100644 index 0000000..c7c8fe7 --- /dev/null +++ b/src/displays/poweroffdisplay.h @@ -0,0 +1,62 @@ +#pragma once + +#include + +#include "display.h" +#include "utils.h" +#include "globals.h" +#include "texts.h" + +namespace { +class MainMenu; +} + +namespace { +class PoweroffDisplay : public Display +{ +public: + void start() override; + void initScreen() override; + void update() override; + void redraw() override {}; + void stop() override; + +private: + unsigned int m_startTime{}; +}; + +void PoweroffDisplay::start() +{ + m_startTime = millis(); + + for (Controller &controller : controllers()) + controller.command.poweroff = true; +} + +void PoweroffDisplay::initScreen() +{ + tft.fillScreen(TFT_BLACK); + tft.setTextColor(TFT_YELLOW); + + tft.drawString(TEXT_POWEROFF, 5, 5, 4); + + tft.fillRect(0, 34, tft.width(), 3, TFT_WHITE); + + tft.setTextColor(TFT_WHITE); + tft.drawString("Trying to turn off", 15, 50, 4); + tft.drawString("both controllers", 25, 75, 4); + tft.drawString("Please stand still...", 20, 125, 4); +} + +void PoweroffDisplay::update() +{ + if (millis() - m_startTime >= 1000) + switchScreen(); +} + +void PoweroffDisplay::stop() +{ + for (Controller &controller : controllers()) + controller.command.poweroff = false; +} +} diff --git a/src/displays/spirodisplay.h b/src/displays/spirodisplay.h new file mode 100644 index 0000000..efce4ea --- /dev/null +++ b/src/displays/spirodisplay.h @@ -0,0 +1,136 @@ +#pragma once + +#include + +#include +#include + +#include "demodisplay.h" +#include "actions/switchscreenaction.h" + +namespace { +class DemosMenu; +} + +namespace { +class SpiroDisplay : public DemoDisplay, public SwitchScreenAction +{ + using Base = DemoDisplay; + +public: + void initScreen() override; + void redraw() override; + void stop() override; + +private: + constexpr static auto DEG2RAD = 0.0174532925; + + static unsigned int rainbow(int value); + + float sx = 0, sy = 0; + uint16_t x0 = 0, x1 = 0, yy0 = 0, yy1 = 0; + + long i{0}; + int n{}, r{}, colour{}; +}; + +void SpiroDisplay::initScreen() +{ + tft.fillScreen(TFT_BLACK); + tft.setRotation(3); +} + +void SpiroDisplay::redraw() +{ + for (int j = 0; j < std::max(1, n); j++) + { + if (i == 0) + { + tft.fillScreen(TFT_BLACK); + n = random(2, 23); + r = random(20, 100); + colour = 0; //rainbow(); + } + + if (i < (360 * n)) + { + sx = std::cos((i / n - 90) * DEG2RAD); + sy = std::sin((i / n - 90) * DEG2RAD); + x0 = sx * (120 - r) + 159; + yy0 = sy * (120 - r) + 119; + + + sy = std::cos(((i % 360) - 90) * DEG2RAD); + sx = std::sin(((i % 360) - 90) * DEG2RAD); + x1 = sx * r + x0; + yy1 = sy * r + yy0; + tft.drawPixel(x1, yy1, rainbow(map(i%360,0,360,0,127))); //colour); + } + + if (i == (360 * n)) + { + r = random(20, 100);//r = r / random(2,4); + } + + if (i >= (360 * n)) + { + auto new_i = i - (360 * n); + + sx = std::cos((new_i / n - 90) * DEG2RAD); + sy = std::sin((new_i / n - 90) * DEG2RAD); + x0 = sx * (120 - r) + 159; + yy0 = sy * (120 - r) + 119; + + + sy = std::cos(((new_i % 360) - 90) * DEG2RAD); + sx = std::sin(((new_i % 360) - 90) * DEG2RAD); + x1 = sx * r + x0; + yy1 = sy * r + yy0; + tft.drawPixel(x1, yy1, rainbow(map(new_i%360,0,360,0,127))); //colour); + } + + i++; + if (i == 2* (360 * n)) + i = 0; + } +} + +void SpiroDisplay::stop() +{ + tft.setRotation(0); +} + +unsigned int SpiroDisplay::rainbow(int value) +{ + // Value is expected to be in range 0-127 + // The value is converted to a spectrum colour from 0 = blue through to red = blue + //int value = random (128); + byte red = 0; // Red is the top 5 bits of a 16 bit colour value + byte green = 0;// Green is the middle 6 bits + byte blue = 0; // Blue is the bottom 5 bits + + byte quadrant = value / 32; + + if (quadrant == 0) { + blue = 31; + green = 2 * (value % 32); + red = 0; + } + if (quadrant == 1) { + blue = 31 - (value % 32); + green = 63; + red = 0; + } + if (quadrant == 2) { + blue = 0; + green = 63; + red = value % 32; + } + if (quadrant == 3) { + blue = 0; + green = 63 - 2 * (value % 32); + red = 31; + } + return (red << 11) + (green << 5) + blue; +} +} diff --git a/src/displays/starfielddisplay.h b/src/displays/starfielddisplay.h new file mode 100644 index 0000000..f3f478a --- /dev/null +++ b/src/displays/starfielddisplay.h @@ -0,0 +1,111 @@ +#pragma once + +#include + +#include + +#include "demodisplay.h" +#include "actions/switchscreenaction.h" +#include "globals.h" + +namespace { +class DemosMenu; +} + +namespace { +class StarfieldDisplay : public DemoDisplay, public SwitchScreenAction +{ + using Base = DemoDisplay; + +public: + StarfieldDisplay(); + + void initScreen() override; + void redraw() override; + void stop() override; + +private: + // Fast 0-255 random number generator from http://eternityforest.com/Projects/rng.php: + uint8_t rng(); + + static constexpr auto NSTARS = 1024; + + uint8_t sx[NSTARS] = {}; + uint8_t sy[NSTARS] = {}; + uint8_t sz[NSTARS] = {}; + + uint8_t za, zb, zc, zx; +}; + +StarfieldDisplay::StarfieldDisplay() : + za(random(256)), + zb(random(256)), + zc(random(256)), + zx(random(256)) +{ +} + +void StarfieldDisplay::initScreen() +{ + tft.fillScreen(TFT_BLACK); + tft.setRotation(1); + + // fastSetup() must be used immediately before fastPixel() to prepare screen + // It must be called after any other graphics drawing function call if fastPixel() + // is to be called again + //tft.fastSetup(); // Prepare plot window range for fast pixel plotting +} + +void StarfieldDisplay::redraw() +{ + uint8_t spawnDepthVariation = 255; + + for(int i = 0; i < NSTARS; ++i) + { + if (sz[i] <= 1) + { + sx[i] = 160 - 120 + rng(); + sy[i] = rng(); + sz[i] = spawnDepthVariation--; + } + else + { + int old_screen_x = ((int)sx[i] - 160) * 256 / sz[i] + 160; + int old_screen_y = ((int)sy[i] - 120) * 256 / sz[i] + 120; + + // This is a faster pixel drawing function for occassions where many single pixels must be drawn + tft.drawPixel(old_screen_x, old_screen_y,TFT_BLACK); + + sz[i] -= 2; + if (sz[i] > 1) + { + int screen_x = ((int)sx[i] - 160) * 256 / sz[i] + 160; + int screen_y = ((int)sy[i] - 120) * 256 / sz[i] + 120; + + if (screen_x >= 0 && screen_y >= 0 && screen_x < 320 && screen_y < 240) + { + uint8_t r, g, b; + r = g = b = 255 - sz[i]; + tft.drawPixel(screen_x, screen_y, tft.color565(r,g,b)); + } + else + sz[i] = 0; // Out of screen, die. + } + } + } +} + +void StarfieldDisplay::stop() +{ + tft.setRotation(0); +} + +uint8_t StarfieldDisplay::rng() +{ + zx++; + za = (za^zc^zx); + zb = (zb+za); + zc = (zc+(zb>>1)^za); + return zc; +} +} diff --git a/src/displays/statusdisplay.h b/src/displays/statusdisplay.h new file mode 100644 index 0000000..a221b41 --- /dev/null +++ b/src/displays/statusdisplay.h @@ -0,0 +1,255 @@ +#pragma once + +#include +#include + +#include "demodisplay.h" +#include "actions/switchscreenaction.h" + +#include "modeinterface.h" +#include "globals.h" +#include "utils.h" +#include "widgets/label.h" +#include "widgets/progressbar.h" +#include "icons/alert.h" + +namespace { +class MainMenu; +class BmsDisplay; +class MetersDisplay; +} + +namespace { +class StatusDisplay : public DemoDisplay, public SwitchScreenAction +{ + using Base = DemoDisplay; + +public: + void initScreen() override; + void redraw() override; + + void rotate(int offset) override; + +private: + class BoardStatus + { + public: + BoardStatus(int y) : + m_y{y}, + m_labelLeftPwm{65, y}, // 80, 22 + m_labelRightPwm{155, y}, // 80, 22 + m_labelVoltage{30, y+25}, // 85, 22 + m_labelTemperature{150, y+25}, // 85, 22 + m_leftMotor{y+50}, + m_rightMotor{y+75} + {} + + void start(); + void redraw(const Controller &controller); + + private: + void drawWarning(); + + class MotorStatus + { + public: + MotorStatus(int y) : + m_labelError{18, y}, // 18, 22, + m_labelCurrent{40, y}, // 85, 22 + m_labelSpeed{135, y}, // 75, 22 + m_labelHallSensors{210, y} // 30, 15 + {} + + void start(); + void redraw(const MotorFeedback &motor); + + private: + Label m_labelError; + Label m_labelCurrent; + Label m_labelSpeed; + Label m_labelHallSensors; + }; + + const int m_y; + + bool m_lastFeedbackValid{}; + + Label m_labelLeftPwm; + Label m_labelRightPwm; + + Label m_labelVoltage; + Label m_labelTemperature; + + MotorStatus m_leftMotor; + MotorStatus m_rightMotor; + }; + + Label m_labelRawGas{45, 0}; // 40, 15 + Label m_labelGas{90, 0}; // 60, 15 + ProgressBar m_progressBarGas{150, 0, 90, 15, 0, 1000}; + + Label m_labelRawBrems{45, 15}; // 40, 15 + Label m_labelBrems{90, 15}; // 60, 15 + ProgressBar m_progressBarBrems{150, 15, 90, 15, 0, 1000}; + + BoardStatus m_frontStatus{42}; + BoardStatus m_backStatus{142}; + + Label m_labelWifiStatus{35, 266}; // 120, 15 + Label m_labelLimit0{205, 266}; // 35, 15 + Label m_labelIpAddress{25, 281}; // 130, 15 + Label m_labelLimit1{205, 281}; // 35, 15 + Label m_labelPerformance{85, 296}; // 40, 15 + Label m_labelMode{165, 296}; // 75, 15 +}; + +void StatusDisplay::initScreen() +{ + tft.fillScreen(TFT_BLACK); + tft.setTextFont(2); + tft.setTextColor(TFT_WHITE); + + tft.drawString("gas", 0, 0); + m_labelRawGas.start(); + m_labelGas.start(); + m_progressBarGas.start(); + tft.drawString("brems", 0, 15); + m_labelRawBrems.start(); + m_labelBrems.start(); + m_progressBarBrems.start(); + + m_frontStatus.start(); + m_backStatus.start(); + + tft.setTextFont(2); + tft.drawString("WiFi:", 0, 266); + m_labelWifiStatus.start(); + tft.drawString("Limit0:", 160, 266); + m_labelLimit0.start(); + tft.drawString("IP:", 0, 281); + m_labelIpAddress.start(); + tft.drawString("Limit1:", 160, 281); + m_labelLimit1.start(); + tft.drawString("Performance:", 0, 296); + m_labelPerformance.start(); + tft.drawString("Mode:", 125, 296); + m_labelMode.start(); + + tft.setTextColor(TFT_WHITE, TFT_BLACK); +} + +void StatusDisplay::redraw() +{ + tft.setTextFont(2); + m_labelRawGas.redraw(String{raw_gas}); + m_labelGas.redraw(String{gas}); + m_progressBarGas.redraw(gas); + m_labelRawBrems.redraw(String{raw_brems}); + m_labelBrems.redraw(String{brems}); + m_progressBarBrems.redraw(brems); + + m_frontStatus.redraw(front); + m_backStatus.redraw(back); + + tft.setTextFont(2); + m_labelWifiStatus.redraw(toString(WiFi.status())); + m_labelLimit0.redraw(String{front.command.left.iMotMax} + "A"); + m_labelIpAddress.redraw(WiFi.localIP().toString()); + m_labelLimit1.redraw(String{front.command.left.iDcMax} + "A"); + m_labelPerformance.redraw(String{performance.last}); + m_labelMode.redraw(currentMode->displayName()); +} + +void StatusDisplay::rotate(int offset) +{ + if (offset < 0) + switchScreen(); + else if (offset > 0) + switchScreen(); +} + +void StatusDisplay::BoardStatus::start() +{ + tft.setTextFont(4); + tft.drawString("pwm:", 0, m_y); + m_labelLeftPwm.start(); + m_labelRightPwm.start(); + drawWarning(); +} + +void StatusDisplay::BoardStatus::redraw(const Controller &controller) +{ + tft.setTextFont(4); + + m_labelLeftPwm.redraw(String{controller.command.left.pwm}); + m_labelRightPwm.redraw(String{controller.command.right.pwm}); + + if (controller.feedbackValid != m_lastFeedbackValid) + { + tft.fillRect(0, m_y+25, tft.width(), 75, TFT_BLACK); + + if (controller.feedbackValid) + { + tft.setTextColor(TFT_WHITE); + + tft.drawString("U=", 0, m_y+25, 4); + m_labelVoltage.start(); + tft.drawString("T=", 120, m_y+25, 4); + m_labelTemperature.start(); + tft.drawString("l:", 0, m_y+50, 4); + m_leftMotor.start(); + tft.drawString("r:", 0, m_y+75, 4); + m_rightMotor.start(); + + tft.setTextColor(TFT_WHITE, TFT_BLACK); + } + else + drawWarning(); + + m_lastFeedbackValid = controller.feedbackValid; + } + + if (controller.feedbackValid) + { + m_labelVoltage.redraw(String{fixBatVoltage(controller.feedback.batVoltage)} + 'V'); + m_labelTemperature.redraw(String{fixBoardTemp(controller.feedback.boardTemp)} + 'C'); + m_leftMotor.redraw(controller.feedback.left); + m_rightMotor.redraw(controller.feedback.right); + } +} + +void StatusDisplay::BoardStatus::drawWarning() +{ + tft.setTextColor(TFT_RED); + tft.drawString("No data!", 60, m_y+50, 4); + tft.setTextColor(TFT_WHITE, TFT_BLACK); + + tft.setSwapBytes(true); + tft.pushImage(10, m_y+40, icons::alert.WIDTH, icons::alert.HEIGHT, icons::alert.buffer); + tft.setSwapBytes(false); +} + +void StatusDisplay::BoardStatus::MotorStatus::start() +{ + m_labelError.start(); + m_labelCurrent.start(); + m_labelSpeed.start(); + m_labelHallSensors.start(); +} + +void StatusDisplay::BoardStatus::MotorStatus::redraw(const MotorFeedback &motor) +{ + tft.setTextFont(4); + tft.setTextColor(motor.error?TFT_RED:TFT_GREEN, TFT_BLACK); + m_labelError.redraw(String{motor.error}); + tft.setTextColor(TFT_WHITE, TFT_BLACK); + + m_labelCurrent.redraw(String{fixCurrent(motor.current)} + 'A'); + m_labelSpeed.redraw(String{convertToKmh(motor.speed)}); + + tft.setTextFont(2); + m_labelHallSensors.redraw(hallString(motor)); + + tft.setTextColor(TFT_WHITE, TFT_BLACK); +} +} diff --git a/src/displays/updatedisplay.h b/src/displays/updatedisplay.h new file mode 100644 index 0000000..add4fa1 --- /dev/null +++ b/src/displays/updatedisplay.h @@ -0,0 +1,93 @@ +#pragma once + +#include + +#include +#include + +#include "display.h" +#include "actions/switchscreenaction.h" +#include "globals.h" +#include "texts.h" +#include "widgets/label.h" +#include "widgets/progressbar.h" +#include "modes/ignoreinputmode.h" + +namespace { +class StatusDisplay; +} + +namespace { +class UpdateDisplay : public Display +{ +public: + UpdateDisplay(const String &title); + UpdateDisplay(String &&title); + + void start() override; + void initScreen() override; + void redraw() override; + void button() override; + +public: + bool m_finished; + unsigned int m_progress; + unsigned int m_total; + ota_error_t m_error; + bool m_errorValid; + +private: + const String m_title; + + Label m_progressLabel{20, 150}; + + ProgressBar m_progressBar{20, 200, 200, 10, 0, 100}; +}; + +UpdateDisplay::UpdateDisplay(const String &title) : + m_title{title} +{} + +UpdateDisplay::UpdateDisplay(String &&title) : + m_title{std::move(title)} +{} + +void UpdateDisplay::start() +{ + m_finished = false; + m_progress = 0; + m_total = 1; + m_errorValid = false; +} + +void UpdateDisplay::initScreen() +{ + tft.fillScreen(TFT_BLACK); + tft.setTextFont(4); + tft.setTextColor(TFT_YELLOW); + + tft.drawString(m_title, 5, 5, 4); + + tft.fillRect(0, 34, tft.width(), 3, TFT_WHITE); + + tft.setTextColor(TFT_WHITE, TFT_BLACK); + + tft.drawString("Progress:", 20, 125); + m_progressLabel.start(); + + m_progressBar.start(); +} + +void UpdateDisplay::redraw() +{ + m_progressLabel.redraw(String{} + m_progress + '/' + m_total); + + m_progressBar.redraw(float(m_progress) / m_total * 100.f); +} + +void UpdateDisplay::button() +{ + if (m_finished) + switchScreen(); +} +} diff --git a/src/dpad.h b/src/dpad.h new file mode 100644 index 0000000..9671ed8 --- /dev/null +++ b/src/dpad.h @@ -0,0 +1,82 @@ +#pragma once + +#include + +#include + +#include "globals.h" + +namespace { +using DPadState = std::tuple; + +template +class DPadHelper +{ +public: + static constexpr auto OutPin = OUT; + static constexpr auto In1Pin = IN1; + static constexpr auto In2Pin = IN2; + + void begin(); + + DPadState read(); +}; + +template +void DPadHelper::begin() +{ + pinMode(OUT, OUTPUT); +} + +template +DPadState DPadHelper::read() +{ + digitalWrite(OUT, LOW); + + pinMode(IN1, INPUT_PULLUP); + pinMode(IN2, INPUT_PULLUP); + + delay(1); + + const bool result0 = digitalRead(IN1)==LOW; + const bool result1 = digitalRead(IN2)==LOW; + + digitalWrite(OUT, HIGH); + + pinMode(IN1, INPUT_PULLDOWN); + pinMode(IN2, INPUT_PULLDOWN); + + delay(1); + + const bool result2 = digitalRead(IN1); + const bool result3 = digitalRead(IN2); + + return std::make_tuple(result0, result1, result2, result3); +} + +#ifdef FEATURE_3WIRESW +DPadHelper dpad; + +DPadState lastState; +void updateDpad() +{ + const auto state = dpad.read(); + + enum { + ButtonUp = 3, + ButtonDown = 0, + ButtonConfirm = 1, + ButtonBack = 2 + }; + + if (!std::get(lastState) && std::get(state)) + InputDispatcher::rotate(-1); + if (!std::get(lastState) && std::get(state)) + InputDispatcher::rotate(1); + if (std::get(lastState) != std::get(state)) + InputDispatcher::button(std::get(state)); + + lastState = state; +} +#endif +} diff --git a/src/esptexthelpers.h b/src/esptexthelpers.h new file mode 100644 index 0000000..3ce9a69 --- /dev/null +++ b/src/esptexthelpers.h @@ -0,0 +1,64 @@ +#pragma once + +#include + +#include "textinterface.h" + +namespace { +template +using EspStatusTextHelper = StatusTextHelper; + +constexpr char TEXT_ESPHEAPSIZE[] = "Heap size: "; +using EspHeapSizeText = EspStatusTextHelper; + +constexpr char TEXT_ESPFREEHEAP[] = "Free heap: "; +using EspFreeHeapText = EspStatusTextHelper; + +constexpr char TEXT_ESPMINFREEHEAP[] = "Min free heap: "; +using EspMinFreeHeapText = EspStatusTextHelper; + +constexpr char TEXT_ESPMAXALLOCHEAP[] = "Max alloc heap: "; +using EspMaxAllocHeapText = EspStatusTextHelper; + +constexpr char TEXT_ESPPSRAMSIZE[] = "psram size: "; +using EspPsramSizeText = EspStatusTextHelper; + +constexpr char TEXT_ESPFREEPSRAM[] = "Free psram: "; +using EspFreePsramText = EspStatusTextHelper; + +constexpr char TEXT_ESPMINFREEPSRAM[] = "Min free psram: "; +using EspMinFreePsramText = EspStatusTextHelper; + +constexpr char TEXT_ESPMAXALLOCPSRAM[] = "Max alloc psram: "; +using EspMaxAllocPsramText = EspStatusTextHelper; + +constexpr char TEXT_ESPCHIPREVISION[] = "Chip revision: "; +using EspChipRevisionText = EspStatusTextHelper; + +constexpr char TEXT_ESPCPUFREQMHZ[] = "Cpu freq MHz: "; +using EspCpuFreqMHzText = EspStatusTextHelper; + +constexpr char TEXT_ESPCYCLECOUNT[] = "Cycle count: "; +using EspCycleCountText = EspStatusTextHelper; + +constexpr char TEXT_ESPSDKVERSION[] = "Sdk version: "; +using EspSdkVersionText = EspStatusTextHelper; + +constexpr char TEXT_ESPFLASHCHIPSIZE[] = "Flash chip size: "; +using EspFlashChipSizeText = EspStatusTextHelper; + +constexpr char TEXT_ESPFLASHCHIPSPEED[] = "Flash chip speed: "; +using EspFlashChipSpeedText = EspStatusTextHelper; + +constexpr char TEXT_ESPFLASHCHIPMODE[] = "Flash chip mode: "; +using EspFlashChipModeText = EspStatusTextHelper; // TODO: improve stringifying + +constexpr char TEXT_ESPSKETCHSIZE[] = "Sketch size: "; +using EspSketchSizeText = StaticallyCachedText>; // caching because of slow + +constexpr char TEXT_ESPSKETCHMD5[] = "Sketch MD5: "; +using EspSketchMd5Text = StaticallyCachedText>; // caching because of slow + +constexpr char TEXT_ESPFREESKETCHSPACE[] = "Free sketch space: "; +using EspFreeSketchSpaceText = EspStatusTextHelper; +} diff --git a/src/feedbackparser.h b/src/feedbackparser.h new file mode 100644 index 0000000..df82308 --- /dev/null +++ b/src/feedbackparser.h @@ -0,0 +1,86 @@ +#pragma once + +#include +#include + +#include + +#include "bobbycar-protocol/protocol.h" + +namespace { +class FeedbackParser +{ +public: + FeedbackParser(const std::reference_wrapper &serial, bool &feedbackValid, Feedback &feedback) : + m_serial{serial}, m_feedbackValid{feedbackValid}, m_feedback{feedback} + { + } + + void update() + { + // Check for new data availability in the Serial buffer + while (m_serial.get().available()) + { + m_incomingByte = m_serial.get().read(); // Read the incoming byte + m_bufStartFrame = ((uint16_t)(m_incomingBytePrev) << 8) + m_incomingByte; // Construct the start frame + + //Serial.printf("received: %x\r\n", m_incomingByte); + + // Copy received data + if (m_bufStartFrame == Feedback::VALID_HEADER) { // Initialize if new data is detected + m_p = (uint8_t*)&m_newFeedback; + *m_p++ = m_incomingBytePrev; + *m_p++ = m_incomingByte; + m_idx = 2; + } else if (m_idx >= 2 && m_idx < sizeof(m_newFeedback)) { // Save the new received data + *m_p++ = m_incomingByte; + m_idx++; + } + + // Check if we reached the end of the package + if (m_idx == sizeof(m_newFeedback)) { + uint16_t checksum = calculateChecksum(m_newFeedback); + + // Check validity of the new data + if (m_newFeedback.start == Feedback::VALID_HEADER && checksum == m_newFeedback.checksum) + { + m_feedbackValid = true; + m_feedback = m_newFeedback; + m_lastFeedback = millis(); + } +// else +// { +// if (m_newFeedback.start == Feedback::VALID_HEADER) +// Serial.println("header matched"); +// else +// Serial.println("header did not match"); + +// if (checksum == m_newFeedback.checksum) +// Serial.println("checksum matched"); +// else +// Serial.println("checksum did not match"); +// } + m_idx = 0; // Reset the index (it prevents to enter in this if condition in the next cycle) + } + + // Update previous states + m_incomingBytePrev = m_incomingByte; + } + + if (millis() - m_lastFeedback > 500) + m_feedbackValid = false; + } + +private: + uint8_t m_idx = 0; // Index for new data pointer + uint16_t m_bufStartFrame{}; // Buffer Start Frame + uint8_t *m_p{}; // Pointer declaration for the new received data + uint8_t m_incomingByte{}; + uint8_t m_incomingBytePrev{}; + + unsigned long m_lastFeedback{millis()}; + const std::reference_wrapper &m_serial; + bool &m_feedbackValid; + Feedback &m_feedback, m_newFeedback; +}; +} diff --git a/src/fontinterface.h b/src/fontinterface.h new file mode 100644 index 0000000..8991052 --- /dev/null +++ b/src/fontinterface.h @@ -0,0 +1,29 @@ +#pragma once + +namespace { +class FontInterface { +public: + virtual int font() const { return 4; }; +}; + +template +class StaticFont : public virtual FontInterface +{ +public: + static constexpr int STATIC_FONT = TFont; + + int font() const override { return TFont; } +}; + +using DefaultFont = StaticFont<4>; + +class ChangeableFont : public virtual FontInterface +{ +public: + int font() const override { return m_font; } + void setfont(const int &font) { m_font = font; } + +private: + int m_font; +}; +} diff --git a/src/globals.h b/src/globals.h new file mode 100644 index 0000000..d810b1c --- /dev/null +++ b/src/globals.h @@ -0,0 +1,79 @@ +#pragma once + +#include + +#include +#include +#include +#include + +#include "controller.h" +#include "display.h" +#include "modeinterface.h" +#include "settings.h" +#include "settingssaver.h" + +namespace { +using pin_t = int; + +int16_t raw_gas, raw_brems; +float gas, brems; +float avgSpeed, avgSpeedKmh, sumCurrent, sumAbsoluteCurrent; + +Settings settings; +SettingsSaver settingsSaver; + +Controller front{Serial1, settings.hardware.enableFrontLeft, settings.hardware.enableFrontRight, settings.hardware.invertFrontLeft, settings.hardware.invertFrontRight}; +Controller back{Serial2, settings.hardware.enableBackLeft, settings.hardware.enableBackRight, settings.hardware.invertBackLeft, settings.hardware.invertBackRight}; + +struct { + unsigned long lastTime = millis(); + int current{0}; + int last{0}; +} performance; + +BluetoothSerial bluetoothSerial; + +TFT_eSPI tft = TFT_eSPI(); + +ModeInterface *currentMode{}; + +Display *currentDisplay{}; + +int rotated{}; +bool requestFullRedraw{}; +bool buttonLongPressed{}; +bool buttonPressed{}; + +class InputDispatcher +{ +public: + static void rotate(int offset) + { + rotated += offset; + } + + static void button(bool pressed) + { + static unsigned long pressBegin = 0; + + const auto now = millis(); + + if (pressed) + pressBegin = now; + else + { + const auto duration = now - pressBegin; + + if (duration < 1000) + buttonPressed = true; + else if (duration < 3000) + buttonLongPressed = true; + else + requestFullRedraw = true; + + pressBegin = 0; + } + } +}; +} diff --git a/src/htmltag.h b/src/htmltag.h new file mode 100644 index 0000000..6def81e --- /dev/null +++ b/src/htmltag.h @@ -0,0 +1,46 @@ +#pragma once + +#include + +namespace { +class HtmlTag { +public: + HtmlTag(AsyncResponseStream &stream, const char *tag); + + template + HtmlTag(AsyncResponseStream &stream, const char *tag, const T &x); + + ~HtmlTag(); + +private: + AsyncResponseStream &stream; + const char * const tag; +}; + +HtmlTag::HtmlTag(AsyncResponseStream &stream, const char *tag) : + stream{stream}, + tag{tag} +{ + stream.print("<"); + stream.print(tag); + stream.print(">"); +} + +template +HtmlTag::HtmlTag(AsyncResponseStream &stream, const char *tag, const T &x) : + stream{stream}, + tag{tag} +{ + stream.print("<"); + stream.print(tag); + stream.print(x); + stream.print(">"); +} + +HtmlTag::~HtmlTag() +{ + stream.print(""); +} +} diff --git a/src/htmlutils.h b/src/htmlutils.h new file mode 100644 index 0000000..cf1ba2d --- /dev/null +++ b/src/htmlutils.h @@ -0,0 +1,91 @@ +#pragma once + +#include "htmltag.h" + +namespace { +void breakLine(AsyncResponseStream &stream) +{ + stream.print("
"); +} + +void label(AsyncResponseStream &stream, const char *name, const char *text) +{ + HtmlTag label(stream, "label", String(" for=\"") + name + "\""); + stream.print(text); +} + +template +void input(AsyncResponseStream &stream, T value, const char *type, const char *id, const char *name, const char *additionalAttributes = nullptr) +{ + stream.print(""); +} + +template +void hiddenInput(AsyncResponseStream &stream, T value, const char *name) +{ + input(stream, value, "hidden", nullptr, name); +} + +template +void numberInput(AsyncResponseStream &stream, T value, const char *id, const char *name, const char *text) +{ + label(stream, id, text); + + breakLine(stream); + + input(stream, value, "number", id, name, " required"); +} + +template +void numberInput(AsyncResponseStream &stream, T value, const char *name, const char *text) +{ + numberInput(stream, value, name, name, text); +} + +void submitButton(AsyncResponseStream &stream) +{ + HtmlTag button(stream, "button", " type=\"submit\""); + stream.print("Submit"); +} + +void checkboxInput(AsyncResponseStream &stream, bool value, const char *id, const char *name, const char *text) +{ + label(stream, id, text); + + breakLine(stream); + + input(stream, "on", "checkbox", id, name, value?" checked":""); +} + +void checkboxInput(AsyncResponseStream &stream, bool value, const char *name, const char *text) +{ + checkboxInput(stream, value, name, name, text); +} + +void selectOption(AsyncResponseStream &stream, const char *value, const char *text, bool selected) +{ + String str{" value=\""}; + str += value; + str += "\""; + + if (selected) + str += " selected"; + + HtmlTag option(stream, "option", str); + stream.print(text); +} +} diff --git a/src/icon.h b/src/icon.h new file mode 100644 index 0000000..eb919a5 --- /dev/null +++ b/src/icon.h @@ -0,0 +1,14 @@ +#pragma once + +#include + +namespace { +template +struct Icon +{ + static constexpr auto WIDTH=width; + static constexpr auto HEIGHT=height; + + const unsigned short buffer[width*height]; +}; +} diff --git a/src/iconinterface.h b/src/iconinterface.h new file mode 100644 index 0000000..ce4b7ab --- /dev/null +++ b/src/iconinterface.h @@ -0,0 +1,19 @@ +#pragma once + +#include "icon.h" + +namespace { +template +class IconInterface +{ +public: + virtual const Icon *icon() const { return nullptr; } +}; + +template *T> +class StaticIcon : public virtual IconInterface +{ +public: + virtual const Icon *icon() const { return T; } +}; +} diff --git a/src/icons/alert.h b/src/icons/alert.h new file mode 100644 index 0000000..44ab457 --- /dev/null +++ b/src/icons/alert.h @@ -0,0 +1,42 @@ +#pragma once + +#include "icon.h" + +namespace { +namespace icons { +const Icon<32, 32> alert{{ +0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // row 0, 32 pixels +0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1080,0xAC66,0xEDE8,0xFE69,0xC4C6,0x2901,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // row 1, 64 pixels +0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xBCC6,0xFE68,0xFE68,0xFE6A,0xFE68,0xEDE8,0x18A1,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // row 2, 96 pixels +0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x8344,0xFE48,0xFE8C,0xFFDD,0xFFFF,0xFEF0,0xFE48,0xB466,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // row 3, 128 pixels +0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1880,0xEDC7,0xFE48,0xFF99,0xFFBC,0xFF9B,0xFFBD,0xFE6A,0xFE48,0x5A23,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // row 4, 160 pixels +0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x9BE5,0xFE28,0xFED0,0xFFBC,0xFF7A,0xFF9A,0xFF9B,0xFF35,0xFE28,0xBCA6,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // row 5, 192 pixels +0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3962,0xFE28,0xFE28,0xFF9A,0xFF79,0xFF9A,0xFF9B,0xFF9A,0xFFBD,0xFE6B,0xFE28,0x72E3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // row 6, 224 pixels +0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xB465,0xFE28,0xFEF2,0xFF7A,0xFF79,0xFF7A,0xFF9A,0xFF7A,0xFF7A,0xFF78,0xFE28,0xDD67,0x0860,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // row 7, 256 pixels +0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x5A22,0xFE07,0xFE29,0xFF9B,0xFF37,0xFF58,0xFF79,0xFF79,0xFF79,0xFF58,0xFF9B,0xFEAE,0xFE07,0x93A4,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // row 8, 288 pixels +0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xC4A5,0xFE07,0xFF15,0xFF37,0xFF36,0xAD11,0x2965,0x2965,0xCDF4,0xFF37,0xFF37,0xFF79,0xFE07,0xFE07,0x2901,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // row 9, 320 pixels +0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7B03,0xFDE7,0xFE4B,0xFF79,0xFEF4,0xFF15,0xB552,0x2945,0x2945,0xDE55,0xFF16,0xFF15,0xFF58,0xFED1,0xFDE7,0xAC25,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // row 10, 352 pixels +0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0xDD26,0xFDE7,0xFF57,0xFED3,0xFED2,0xFEF4,0xBD93,0x2124,0x2124,0xDE75,0xFF14,0xFED3,0xFED3,0xFF7A,0xFE08,0xFDE7,0x49A2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // row 11, 384 pixels +0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x9BA4,0xFDC6,0xFE6E,0xFF36,0xFE90,0xFEB1,0xFED3,0xC592,0x2124,0x2124,0xE675,0xFED3,0xFEB2,0xFEB1,0xFEF3,0xFEF3,0xFDC6,0xBC45,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // row 12, 416 pixels +0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3141,0xF5C6,0xF5C7,0xFF58,0xFE90,0xFE6F,0xFE8F,0xFEB1,0xCDB2,0x2104,0x2104,0xF6B4,0xFEB1,0xFE90,0xFE8F,0xFE90,0xFF58,0xFE0A,0xF5C6,0x72A3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // row 13, 448 pixels +0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xABE4,0xF5A6,0xFEB1,0xFED3,0xFE4E,0xFE6E,0xFE6F,0xFE90,0xD5F2,0x18E3,0x18E3,0xFED4,0xFE90,0xFE6F,0xFE6F,0xFE6E,0xFE91,0xFF36,0xF5A6,0xCCA5,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // row 14, 480 pixels +0x0000,0x0000,0x0000,0x0000,0x0000,0x5202,0xF5A6,0xF5C7,0xFF58,0xFE4D,0xFE4D,0xFE4D,0xFE4E,0xFE6F,0xDE11,0x18C3,0x18C3,0xFED3,0xFE6F,0xFE6E,0xFE4E,0xFE4D,0xFE4D,0xFF16,0xFE2C,0xF5A6,0x9363,0x0000,0x0000,0x0000,0x0000,0x0000, // row 15, 512 pixels +0x0000,0x0000,0x0000,0x0000,0x0000,0xBC44,0xF585,0xFED3,0xFE6F,0xFE2C,0xFE2C,0xFE2D,0xFE4D,0xFE4E,0xE630,0x10A2,0x2104,0xFED1,0xFE4E,0xFE4D,0xFE4D,0xFE2D,0xFE2C,0xFE4D,0xFF37,0xF586,0xF585,0x28E1,0x0000,0x0000,0x0000,0x0000, // row 16, 544 pixels +0x0000,0x0000,0x0000,0x0000,0x7282,0xF565,0xF5EA,0xFF16,0xFE0B,0xFE0B,0xFE0B,0xFE2C,0xFE2C,0xFE4D,0xF670,0x1082,0x2924,0xFEB0,0xFE2D,0xFE2C,0xFE2C,0xFE2C,0xFE0B,0xFE0B,0xFEB2,0xFE6F,0xF565,0xA383,0x0000,0x0000,0x0000,0x0000, // row 17, 576 pixels +0x0000,0x0000,0x0000,0x0840,0xD4C4,0xF565,0xFEF5,0xFE0C,0xFDE9,0xFDEA,0xFE0A,0xFE0B,0xFE0B,0xFE2C,0xFE8F,0x0861,0x2964,0xFE8F,0xFE2C,0xFE0B,0xFE0B,0xFE0B,0xFE0A,0xFDEA,0xFE0B,0xFF37,0xF586,0xF565,0x4181,0x0000,0x0000,0x0000, // row 18, 608 pixels +0x0000,0x0000,0x0000,0x9343,0xF545,0xF60C,0xFED3,0xFDC8,0xFDC8,0xFDC9,0xFDE9,0xFDEA,0xFDEA,0xFE0B,0xFE8E,0x0861,0x3184,0xFE6D,0xFE0B,0xFE0A,0xFDEA,0xFDEA,0xFDE9,0xFDC9,0xFDC9,0xFE4E,0xFEB2,0xF545,0xB3E3,0x0000,0x0000,0x0000, // row 19, 640 pixels +0x0000,0x0000,0x28E0,0xF544,0xF545,0xFF17,0xFDC8,0xFDA7,0xFDA7,0xFDC8,0xFDC8,0xFDC9,0xFDC9,0xFDE9,0xFE6C,0x10A2,0x39C4,0xFE4C,0xFDEA,0xFDE9,0xFDC9,0xFDC9,0xFDC8,0xFDC8,0xFDA7,0xFDA8,0xFF16,0xF588,0xF544,0x6222,0x0000,0x0000, // row 20, 672 pixels +0x0000,0x0000,0xA383,0xF524,0xF64E,0xFE4E,0xFD86,0xFD86,0xFD87,0xFDA7,0xFDA7,0xFDA8,0xFDC8,0xFDC8,0xFE2A,0xA469,0xB4EA,0xFE2A,0xFDC9,0xFDC8,0xFDC8,0xFDA8,0xFDA7,0xFDA7,0xFD87,0xFD86,0xFDEA,0xFED3,0xF524,0xC443,0x0000,0x0000, // row 21, 704 pixels +0x0000,0x51C1,0xF504,0xF546,0xFF16,0xF565,0xFD65,0xFD65,0xFD86,0xFD86,0xFD86,0xFDA7,0xFDA7,0xFDA7,0xFDE8,0xFE6A,0xFE4A,0xFDE8,0xFDA7,0xFDA7,0xFDA7,0xFDA7,0xFD86,0xFD86,0xFD86,0xFD65,0xFD65,0xFEB2,0xF5CA,0xF504,0x8AE2,0x0000, // row 22, 736 pixels +0x0000,0xB3A2,0xED03,0xFE92,0xFDC9,0xF543,0xF544,0xFD44,0xFD65,0xFD65,0xFD65,0xFD86,0xFD86,0xFD86,0xFDA7,0xFDC7,0xFDC7,0xFDA7,0xFD86,0xFD86,0xFD86,0xFD86,0xFD65,0xFD65,0xFD65,0xFD44,0xF544,0xFD86,0xFEF5,0xED03,0xE4C3,0x1880, // row 23, 768 pixels +0x7241,0xECE3,0xF567,0xFED3,0xF523,0xF523,0xF523,0xF543,0xF544,0xF544,0xFD65,0xFD65,0xFD65,0xFD65,0xD4E6,0x39C5,0x39A5,0xD4E6,0xFD86,0xFD65,0xFD65,0xFD65,0xFD65,0xF544,0xF544,0xF543,0xF523,0xF523,0xFE2E,0xF5EC,0xECE3,0x9B42, // row 24, 800 pixels +0xD443,0xECE3,0xFED4,0xF565,0xF502,0xF502,0xF522,0xF523,0xF523,0xF543,0xF544,0xF544,0xF544,0xFD65,0x8B64,0x18C3,0x18C3,0x8344,0xFD85,0xFD44,0xF544,0xF544,0xF544,0xF543,0xF523,0xF523,0xF522,0xF502,0xF523,0xFEF5,0xED04,0xECE3, // row 25, 832 pixels +0xECC3,0xF5AB,0xFE6F,0xF501,0xF4E1,0xF501,0xF502,0xF502,0xF522,0xF522,0xF523,0xF523,0xF523,0xFD84,0xC504,0x20E1,0x18E1,0xC4E4,0xFD84,0xF543,0xF523,0xF523,0xF523,0xF522,0xF522,0xF502,0xF502,0xF501,0xF501,0xFDC9,0xF62F,0xECC3, // row 26, 864 pixels +0xECC2,0xFE92,0xF523,0xF4E0,0xF4E0,0xF4E1,0xF4E1,0xF501,0xF501,0xF502,0xF502,0xF522,0xF522,0xF543,0xFDE3,0xFEA5,0xF6A4,0xFE04,0xF543,0xF522,0xF522,0xF522,0xF502,0xF502,0xF501,0xF501,0xF4E1,0xF4E1,0xF4E0,0xF4E1,0xFED4,0xECC2, // row 27, 896 pixels +0xECA2,0xF5EC,0xF4E0,0xF4C0,0xF4E0,0xF4E0,0xF4E0,0xF4E1,0xF4E1,0xF501,0xF501,0xF501,0xF502,0xF502,0xF542,0xFDA2,0xFDA2,0xF542,0xF502,0xF502,0xF502,0xF501,0xF501,0xF501,0xF4E1,0xF4E1,0xF4E0,0xF4E0,0xF4E0,0xF4C0,0xF5A9,0xECA2, // row 28, 928 pixels +0xECA2,0xECA2,0xECC2,0xF4C1,0xF4C1,0xF4C1,0xF4C1,0xF4C1,0xF4C1,0xF4C1,0xF4C1,0xF4E1,0xF4E2,0xF4E2,0xF4E2,0xF4E2,0xF4E2,0xF4E2,0xF4E2,0xF4E2,0xF4E2,0xF4E1,0xF4C1,0xF4C1,0xF4C1,0xF4C1,0xF4C1,0xF4C1,0xF4C1,0xECC2,0xECC3,0xECA2, // row 29, 960 pixels +0x8AC1,0xEC82,0xEC82,0xEC82,0xEC82,0xEC82,0xEC82,0xEC82,0xEC82,0xEC82,0xEC82,0xEC82,0xEC82,0xEC82,0xEC82,0xEC82,0xEC82,0xEC82,0xEC82,0xEC82,0xEC82,0xEC82,0xEC82,0xEC82,0xEC82,0xEC82,0xEC82,0xEC82,0xEC82,0xEC82,0xEC82,0x9B01, // row 30, 992 pixels +0x0000,0x1880,0x51A0,0x8AA1,0x8AA1,0x8AA1,0x8AA1,0x8AA1,0x8AA1,0x8AA1,0x8AA1,0x8AA1,0x8AA1,0x8AA1,0x8AA1,0x8AA1,0x8AA1,0x8AA1,0x8AA1,0x8AA1,0x8AA1,0x8AA1,0x8AA1,0x8AA1,0x8AA1,0x8AA1,0x8AA1,0x8AA1,0x8AA1,0x61E0,0x28E0,0x0000, // row 31, 1024 pixels +}}; +} +} diff --git a/src/icons/back.h b/src/icons/back.h new file mode 100644 index 0000000..a9cb95c --- /dev/null +++ b/src/icons/back.h @@ -0,0 +1,46 @@ +#pragma once + +#include "icon.h" + +namespace { +namespace icons { +const Icon<24, 24> back{{ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x016C, 0x014B, 0x010B, 0x01AC, 0x018C, 0x018C, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0010 (16) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x014B, 0x0009, 0x0000, // 0x0020 (32) pixels + 0x2AD0, 0x3331, 0x00CB, 0x09CD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0030 (48) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x012B, 0x0007, 0x0000, 0x1A6F, 0x5CD7, 0x5C96, 0x0003, 0x09ED, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0040 (64) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x010B, 0x0006, 0xFFFF, 0x022F, 0x6518, // 0x0050 (80) pixels + 0x75FB, 0x5C96, 0x0000, 0x1AB0, 0x2312, 0x22F1, 0x1AB0, 0x1A6F, 0x0A0E, 0x016C, 0x0048, 0x00EA, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0060 (96) pixels + 0x0000, 0x0000, 0x010A, 0x0029, 0x0000, 0x022F, 0x6538, 0x761B, 0x761B, 0x5CD7, 0x024F, 0x22D0, 0x22D0, 0x1AB0, 0x1A6F, 0x124F, // 0x0070 (112) pixels + 0x01CD, 0x002A, 0x0000, 0x018C, 0x0007, 0x014B, 0x0000, 0x0000, 0x0002, 0x0003, 0x0A2E, 0x0000, 0x1A90, 0x6518, 0x7E3C, 0x761C, // 0x0080 (128) pixels + 0x761C, 0x6E1C, 0x65BB, 0x5D9A, 0x5D7A, 0x5539, 0x54F8, 0x4CB7, 0x4C76, 0x3BD4, 0x2B11, 0x1A6F, 0x016C, 0x43F5, 0x012B, 0x00A6, // 0x0090 (144) pixels + 0x0006, 0x024F, 0x0000, 0x22F1, 0x6518, 0x7E3C, 0x7E5C, 0x765C, 0x765C, 0x6E3C, 0x661C, 0x65FC, 0x5DBB, 0x559A, 0x4D5A, 0x44F9, // 0x00A0 (160) pixels + 0x44D8, 0x3C97, 0x4456, 0x3BD4, 0x2AF1, 0x09CD, 0x5D7C, 0x00AA, 0x022F, 0x0000, 0x2AF1, 0x6518, 0x863C, 0x7E3C, 0x6E3C, 0x663C, // 0x00B0 (176) pixels + 0x663D, 0x5E3D, 0x5E1C, 0x5DFC, 0x55DB, 0x559B, 0x4D5A, 0x4519, 0x3CB8, 0x3477, 0x3436, 0x33F5, 0x3BD4, 0x2AF1, 0x018C, 0x0000, // 0x00C0 (192) pixels + 0x014B, 0x22B0, 0x54B7, 0x5D9A, 0x4D7A, 0x3D7B, 0x357B, 0x2D9C, 0x2DDC, 0x2DDC, 0x2DBC, 0x2D7B, 0x355A, 0x3D5A, 0x453A, 0x4519, // 0x00D0 (208) pixels + 0x3CD8, 0x3477, 0x3436, 0x2BD5, 0x2BB5, 0x3394, 0x1A6F, 0x014C, 0x016B, 0x1A90, 0x3436, 0x24D9, 0x14D9, 0x1D1A, 0x1D5B, 0x1D9C, // 0x00E0 (224) pixels + 0x25DD, 0x25DD, 0x1D9C, 0x1D5B, 0x1D1A, 0x1CD9, 0x1CB8, 0x2CB8, 0x3CB8, 0x3477, 0x2C36, 0x2BD5, 0x2394, 0x33D5, 0x22F1, 0x11CC, // 0x00F0 (240) pixels + 0x022F, 0x0004, 0x1AD0, 0x2C57, 0x24F9, 0x1D1A, 0x1D5B, 0x1D7C, 0x1DBC, 0x25BC, 0x1D9C, 0x1D5B, 0x1D1A, 0x1CD9, 0x1C98, 0x1457, // 0x0100 (256) pixels + 0x1C37, 0x2C36, 0x2C16, 0x23D5, 0x2394, 0x23B5, 0x2B32, 0x11CD, 0x0000, 0x0A0E, 0x0000, 0x22F1, 0x2C77, 0x251A, 0x1D3A, 0x1D5B, // 0x0110 (272) pixels + 0x1D7B, 0x1D7B, 0x1D5B, 0x1D3A, 0x1CFA, 0x1CB9, 0x1C78, 0x1457, 0x1416, 0x13D5, 0x23D5, 0x23B5, 0x1B94, 0x1B94, 0x2B52, 0x11ED, // 0x0120 (288) pixels + 0x0023, 0x0000, 0x0A4F, 0x0000, 0x22F1, 0x3497, 0x251A, 0x1D1A, 0x1D3A, 0x2D5B, 0x2D3A, 0x2D1A, 0x24F9, 0x24D9, 0x1478, 0x1437, // 0x0130 (304) pixels + 0x13F6, 0x13B5, 0x1394, 0x1B74, 0x1B74, 0x1B94, 0x2B52, 0x11ED, 0x0000, 0x0087, 0x0000, 0x124F, 0x0000, 0x1AB0, 0x3497, 0x1D1A, // 0x0140 (320) pixels + 0x1CFA, 0x3497, 0x1B32, 0x2373, 0x2393, 0x2BD4, 0x3415, 0x2C57, 0x13F6, 0x1395, 0x1374, 0x1353, 0x1354, 0x2394, 0x2B32, 0x11ED, // 0x0150 (336) pixels + 0x0000, 0x0000, 0x0000, 0x00EA, 0x00EA, 0x0000, 0x126F, 0x3497, 0x24D9, 0x3435, 0x0000, 0x1270, 0x0000, 0x0029, 0x01AC, 0x22F1, // 0x0160 (352) pixels + 0x33F5, 0x1395, 0x1354, 0x1333, 0x0B33, 0x2394, 0x22F1, 0x22B0, 0x0000, 0x0000, 0x0000, 0x0000, 0x010B, 0x0008, 0x0000, 0x1A6F, // 0x0170 (368) pixels + 0x3477, 0x3435, 0x0006, 0x09ED, 0x0027, 0x00EA, 0x01AC, 0x0000, 0x22B0, 0x2BB4, 0x0B33, 0x1333, 0x0B34, 0x2B73, 0x22B0, 0x09AD, // 0x0180 (384) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x012B, 0x0009, 0x0000, 0x1A90, 0x3352, 0x004A, 0x09CD, 0x0000, 0x0000, 0x010A, 0x012B, // 0x0190 (400) pixels + 0x09CD, 0x2B53, 0x1354, 0x0B33, 0x1B54, 0x2B32, 0x228F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x014B, 0x010B, // 0x01A0 (416) pixels + 0x0007, 0x018D, 0x01AC, 0x01AC, 0x0000, 0x0000, 0x0000, 0x014B, 0x09CD, 0x2B32, 0x1374, 0x0B33, 0x2353, 0x2AF1, 0x08EA, 0x1A0D, // 0x01B0 (432) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x01AD, 0x09ED, 0x00CA, 0x018C, 0x018C, 0x0000, 0x0000, 0x0000, 0x018C, // 0x01C0 (448) pixels + 0x09ED, 0x2B53, 0x1354, 0x1B53, 0x2B32, 0x224E, 0x2B11, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x01D0 (464) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00A8, 0x09ED, 0x122E, 0x2B73, 0x1B54, 0x2B53, 0x32D0, 0x43D4, 0x0004, 0x0000, // 0x01E0 (480) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0049, 0x451B, // 0x01F0 (496) pixels + 0x1AB0, 0x2BB4, 0x2B53, 0x32F0, 0x5D3A, 0x0008, 0x00C9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0200 (512) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x018C, 0x010B, 0x3332, 0x3393, 0x2AD0, 0x873F, 0x012B, 0x11ED, 0x0000, 0x0000, // 0x0210 (528) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0109, 0x01AD, 0x018C, // 0x0220 (544) pixels + 0x22B0, 0x32F0, 0x761E, 0x016C, 0x1A2E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0230 (560) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x014B, 0x018C, 0x018C, 0x09CD, 0x4C77, 0x012B, 0x1A0E, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0240 (576) pixels +}}; +} +} diff --git a/src/icons/bluetooth.h b/src/icons/bluetooth.h new file mode 100644 index 0000000..87c1c8d --- /dev/null +++ b/src/icons/bluetooth.h @@ -0,0 +1,46 @@ +#pragma once + +#include "icon.h" + +namespace { +namespace icons { +const Icon<24, 24> bluetooth{{ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x120F, 0x1A50, 0x0000, 0x01CF, 0x2AB1, 0x3B12, 0x4333, 0x4333, 0x3AF2, 0x2AB1, 0x01EF, // 0x0010 (16) pixels + 0x0000, 0x1A50, 0x1210, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1210, 0x018E, 0x0007, 0x2AB1, // 0x0020 (32) pixels + 0x53D5, 0x6457, 0x6C77, 0x6C97, 0x6C77, 0x6457, 0x6436, 0x53B4, 0x2AB1, 0x0009, 0x01AF, 0x1210, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0030 (48) pixels + 0x0000, 0x0000, 0x0000, 0x1A10, 0x018E, 0x0000, 0x32F2, 0x6C77, 0x74D9, 0x6498, 0x5C78, 0x5437, 0x5C57, 0x5C37, 0x5C57, 0x6477, // 0x0040 (64) pixels + 0x5C36, 0x32D2, 0x0003, 0x01AF, 0x1A30, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2251, 0x0007, 0x32F2, 0x6C77, 0x74D9, // 0x0050 (80) pixels + 0x6478, 0x5C78, 0x6CB8, 0x957A, 0x5417, 0x5417, 0x5417, 0x4BF6, 0x5C37, 0x5C16, 0x32D2, 0x000A, 0x2271, 0x0000, 0x0000, 0x0000, // 0x0060 (96) pixels + 0x0000, 0x0000, 0x09AE, 0x0000, 0x2AB1, 0x6C77, 0x6CD9, 0x5C78, 0x5C58, 0x5C37, 0x6CB8, 0xE75E, 0xB63B, 0x4C17, 0x4BF6, 0x4BF6, // 0x0070 (112) pixels + 0x4BD6, 0x5416, 0x53F5, 0x2A91, 0x0000, 0x09CF, 0x0000, 0x0000, 0x0000, 0x0000, 0x016E, 0x01EF, 0x53D5, 0x6CB8, 0x5C57, 0x5C57, // 0x0080 (128) pixels + 0x5C37, 0x5437, 0x6498, 0xEF7E, 0xFFFF, 0xB63B, 0x4BD6, 0x43D6, 0x43B6, 0x4395, 0x53F6, 0x4374, 0x1210, 0x01AE, 0x0000, 0x0000, // 0x0090 (144) pixels + 0x0000, 0x0000, 0x1A30, 0x2AB1, 0x6436, 0x5C57, 0x5437, 0x5417, 0x5417, 0x4BF6, 0x6477, 0xEF7E, 0xEF9F, 0xF7BF, 0xAE1B, 0x4BB6, // 0x00A0 (160) pixels + 0x4395, 0x4395, 0x4395, 0x4BB5, 0x2A91, 0x1A30, 0x0000, 0x0000, 0x0000, 0x0000, 0x2271, 0x3AF2, 0x6437, 0x5417, 0x4BF6, 0x5C57, // 0x00B0 (176) pixels + 0x4BF6, 0x43B6, 0x5C57, 0xEF7E, 0xB65C, 0xA5DA, 0xF7BF, 0xBE5B, 0x43B6, 0x3B55, 0x3B75, 0x4B95, 0x32D2, 0x2271, 0x0000, 0x0000, // 0x00C0 (192) pixels + 0x0000, 0x0000, 0x2AB1, 0x3B13, 0x5C36, 0x4BD6, 0x5C37, 0xCEDD, 0xC69C, 0x4BF6, 0x5416, 0xEF7E, 0xAE1B, 0x3375, 0x9D9A, 0xF7DF, // 0x00D0 (208) pixels + 0xBE5B, 0x4395, 0x3334, 0x4395, 0x32D2, 0x2A91, 0x0000, 0x0000, 0x0000, 0x0000, 0x32B2, 0x3B13, 0x5C16, 0x43B6, 0x4BD6, 0x9DBA, // 0x00E0 (224) pixels + 0xF7BF, 0xDF3E, 0x8D59, 0xEF9E, 0xAE1B, 0x2334, 0x8518, 0xF7BF, 0xD6FD, 0x53D6, 0x3334, 0x4375, 0x32D2, 0x2AB1, 0x0000, 0x0000, // 0x00F0 (240) pixels + 0x0000, 0x0000, 0x32F3, 0x3B13, 0x53F6, 0x4395, 0x3B75, 0x3355, 0x74B8, 0xD6FD, 0xF7BF, 0xFFFF, 0xB61B, 0x9D79, 0xEF9F, 0xCEBC, // 0x0100 (256) pixels + 0x5C16, 0x3334, 0x3334, 0x4374, 0x32D2, 0x2AD3, 0x0000, 0x0000, 0x0000, 0x0000, 0x32F3, 0x3B12, 0x53D5, 0x3B55, 0x3B54, 0x3354, // 0x0110 (272) pixels + 0x3334, 0x4BD5, 0xB61B, 0xFFDF, 0xEF9E, 0xF7BF, 0xB63B, 0x4395, 0x3314, 0x3334, 0x3334, 0x4374, 0x32D2, 0x2AD3, 0x0000, 0x0000, // 0x0120 (288) pixels + 0x0000, 0x0000, 0x32F3, 0x3AF2, 0x4BB5, 0x3334, 0x3334, 0x3334, 0x3334, 0x2B14, 0x5C16, 0xEF7E, 0xFFFF, 0xF7BF, 0x8D19, 0x3334, // 0x0130 (304) pixels + 0x3334, 0x3334, 0x3334, 0x4374, 0x32D2, 0x2AD3, 0x0000, 0x0000, 0x0000, 0x0000, 0x32F3, 0x3AF2, 0x4B95, 0x3334, 0x3334, 0x3334, // 0x0140 (320) pixels + 0x2B14, 0x53D6, 0xC69C, 0xFFFF, 0xCEDD, 0xCEBC, 0xEF9F, 0xB61B, 0x4BB5, 0x3334, 0x3334, 0x4374, 0x32D2, 0x2AD3, 0x0000, 0x0000, // 0x0150 (336) pixels + 0x0000, 0x0000, 0x2AB2, 0x32F2, 0x4B95, 0x3334, 0x3334, 0x2B14, 0x4BF6, 0xD6FD, 0xF7DF, 0xFFFF, 0xADFB, 0x3B75, 0xA5DA, 0xFFDF, // 0x0160 (352) pixels + 0xD6DD, 0x53F6, 0x3334, 0x4374, 0x32D2, 0x2A91, 0x0000, 0x0000, 0x0000, 0x0000, 0x2A91, 0x32F2, 0x4B95, 0x3334, 0x3334, 0x6C77, // 0x0170 (368) pixels + 0xDF3E, 0xEF7E, 0x8D59, 0xEF9E, 0xADFB, 0x1B14, 0x9579, 0xF7DF, 0xBE5C, 0x4395, 0x3334, 0x3B54, 0x2AD2, 0x2291, 0x0000, 0x0000, // 0x0180 (384) pixels + 0x0000, 0x0000, 0x2271, 0x32D2, 0x4B95, 0x3334, 0x4395, 0xCEBC, 0xDF1D, 0x6C77, 0x43B5, 0xEF7E, 0xAE1B, 0xA5BA, 0xF7BF, 0xBE5B, // 0x0190 (400) pixels + 0x4395, 0x3334, 0x3334, 0x3B54, 0x2AB1, 0x2271, 0x0000, 0x0000, 0x0000, 0x0000, 0x1A30, 0x2A91, 0x4B95, 0x4375, 0x3B75, 0x7497, // 0x01A0 (416) pixels + 0x5C36, 0x3354, 0x53F6, 0xE77E, 0xEF9E, 0xF7BF, 0xB61B, 0x4395, 0x3B55, 0x3B55, 0x3B75, 0x4354, 0x2291, 0x1A30, 0x0000, 0x0000, // 0x01B0 (432) pixels + 0x0000, 0x0000, 0x01AE, 0x1210, 0x4353, 0x53F6, 0x4395, 0x3B95, 0x4395, 0x4395, 0x5C37, 0xEF7E, 0xFFFF, 0xBE5B, 0x4BD6, 0x4395, // 0x01C0 (448) pixels + 0x4395, 0x4395, 0x4BB5, 0x3B13, 0x1A30, 0x09CF, 0x0000, 0x0000, 0x0000, 0x0000, 0x11CF, 0x0000, 0x2A91, 0x53D5, 0x5417, 0x4BD6, // 0x01D0 (464) pixels + 0x4BD6, 0x4BD6, 0x6477, 0xE75E, 0xBE5C, 0x5417, 0x4BD6, 0x4BD6, 0x4BD6, 0x53F6, 0x4B95, 0x2291, 0x0000, 0x11EF, 0x0000, 0x0000, // 0x01E0 (480) pixels + 0x0000, 0x0000, 0x0000, 0x2271, 0x000B, 0x32D2, 0x53F6, 0x5C57, 0x5417, 0x5417, 0x6C98, 0x9DBA, 0x5C37, 0x5417, 0x5417, 0x5417, // 0x01F0 (496) pixels + 0x5C37, 0x4BD5, 0x2AB2, 0x000C, 0x2271, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x22F5, 0x0000, 0x0000, 0x2A90, 0x53F5, // 0x0200 (512) pixels + 0x6477, 0x5C58, 0x5C57, 0x5C57, 0x5C57, 0x5C57, 0x5C57, 0x5C57, 0x53D5, 0x2A90, 0x0000, 0x0000, 0x22F5, 0x0000, 0x0000, 0x0000, // 0x0210 (528) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x19ED, 0x4353, 0x53F5, 0x5C37, 0x5C57, 0x5C57, 0x5C37, 0x53F5, 0x4332, // 0x0220 (544) pixels + 0x19ED, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0230 (560) pixels + 0x00A6, 0x21EC, 0x2A6F, 0x32B1, 0x32B1, 0x2A6F, 0x19EC, 0x00A6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0240 (576) pixels +}}; +} +} diff --git a/src/icons/bms.h b/src/icons/bms.h new file mode 100644 index 0000000..3a927c4 --- /dev/null +++ b/src/icons/bms.h @@ -0,0 +1,46 @@ +#pragma once + +#include "icon.h" + +namespace { +namespace icons { +const Icon<24, 24> bms{{ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0010 (16) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0020 (32) pixels + 0xC500, 0xC500, 0xC500, 0xC500, 0xC500, 0xC500, 0xC500, 0xC500, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0030 (48) pixels + 0x0000, 0x0000, 0x0000, 0xC500, 0xC500, 0xC500, 0xC500, 0xC500, 0xC500, 0xD677, 0xEF39, 0xE6B6, 0xC5D2, 0xC500, 0xC500, 0xC500, // 0x0040 (64) pixels + 0xC500, 0xC500, 0xC500, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC500, 0xC500, 0xCD64, 0xDDE9, 0xEECF, // 0x0050 (80) pixels + 0xEECE, 0xE6AE, 0xF756, 0xE6F2, 0xD5E7, 0xBD25, 0xDE29, 0xCD64, 0xCD84, 0xCD42, 0xC500, 0xC500, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0060 (96) pixels + 0x0000, 0x0000, 0x0000, 0xC500, 0xF79B, 0xF753, 0xFF54, 0xF732, 0xF710, 0xE6AC, 0xDE49, 0xC585, 0xBD25, 0xDE28, 0xDE29, 0xD608, // 0x0070 (112) pixels + 0xD5E7, 0xD5E8, 0xCD42, 0xC500, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC500, 0xFFDD, 0xFF98, 0xFF77, 0xF755, // 0x0080 (128) pixels + 0xF753, 0xF733, 0xF732, 0xEF12, 0xEEF0, 0xDE4A, 0xDE28, 0xD5E7, 0xD608, 0xD5E8, 0xC585, 0xC500, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0090 (144) pixels + 0x0000, 0x0000, 0x0000, 0xC500, 0xF731, 0xFFDC, 0xFFDD, 0xFFBB, 0xFFBB, 0xFFBC, 0xFFBA, 0xF777, 0xEF13, 0xDE4A, 0xD608, 0xCDA6, // 0x00A0 (160) pixels + 0xCDE7, 0xBD25, 0xBD45, 0xC500, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC500, 0xF731, 0xFFB9, 0xFFFD, 0xFFDD, // 0x00B0 (176) pixels + 0xFFBB, 0xF775, 0xF710, 0xEF11, 0xEEF0, 0xE68C, 0xCDC8, 0xC565, 0xACC5, 0x8BC3, 0xCDE8, 0xC500, 0x0000, 0x0000, 0x0000, 0x0000, // 0x00C0 (192) pixels + 0x0000, 0x0000, 0x0000, 0xC500, 0xF730, 0xFFB9, 0xFFFE, 0xFFFE, 0xFFDD, 0xF775, 0xEECD, 0xEE8B, 0xE669, 0xD5E5, 0xBD04, 0xA484, // 0x00D0 (208) pixels + 0x9403, 0x8BC3, 0xD60C, 0xC500, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x94D2, 0xCE11, 0xF777, 0xFFDD, 0xFFDE, // 0x00E0 (224) pixels + 0xFFDD, 0xF754, 0xEECC, 0xE68A, 0xDE48, 0xD5E5, 0xBD44, 0xA4A4, 0x9403, 0x7343, 0xAD2F, 0x94D2, 0x0000, 0x0000, 0x0000, 0x0000, // 0x00F0 (240) pixels + 0x0000, 0x0000, 0x0000, 0x8C50, 0xE73C, 0xC617, 0xEF3B, 0xF7BD, 0xFFBC, 0xF753, 0xEEAC, 0xE68A, 0xDE28, 0xD5C6, 0xACA5, 0x83A6, // 0x0100 (256) pixels + 0x6B07, 0x39E7, 0x94B2, 0x8C71, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7BEE, 0xE73C, 0xBDF7, 0xD6BA, 0xE73C, // 0x0110 (272) pixels + 0xE73C, 0xBDF7, 0xA514, 0x9492, 0x8430, 0x7BCF, 0x6B6D, 0x5AEB, 0x528A, 0x4208, 0x94B2, 0x7BEE, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0120 (288) pixels + 0x0000, 0x0000, 0x0000, 0x7BEF, 0xE73C, 0xBDD7, 0xD6BA, 0xE73C, 0xE71C, 0xBDF7, 0xA514, 0x9492, 0x8430, 0x7BCF, 0x7BCF, 0x738E, // 0x0130 (304) pixels + 0x5ACB, 0x4208, 0x94B2, 0x73AE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7BEF, 0xE73C, 0xBDD7, 0xCE79, 0xE71C, // 0x0140 (320) pixels + 0xE71C, 0xBDD7, 0xA514, 0x9492, 0x8C51, 0x73AE, 0x7BCF, 0x7BEF, 0x5AEB, 0x4208, 0x94B2, 0x73AE, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0150 (336) pixels + 0x0000, 0x0000, 0x0000, 0x73CE, 0xE73C, 0xB5B6, 0xCE79, 0xE71C, 0xDEFB, 0xB5B6, 0xA514, 0x9492, 0x8430, 0x73AE, 0x73AE, 0x8410, // 0x0160 (352) pixels + 0x5AEB, 0x4208, 0x94B2, 0x6B6D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6B8D, 0xE73C, 0xB5B6, 0xCE59, 0xDEFB, // 0x0170 (368) pixels + 0xDEFB, 0xB5B6, 0xA514, 0x9492, 0x8430, 0x7BCF, 0x738E, 0x73AE, 0x5ACB, 0x4208, 0x94B2, 0x632C, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0180 (384) pixels + 0x0000, 0x0000, 0x0000, 0x6B8D, 0xE73C, 0xB5B6, 0xC638, 0xDEDB, 0xDEDB, 0xB596, 0xA514, 0x9492, 0x8430, 0x7BCF, 0x7BEF, 0x8410, // 0x0190 (400) pixels + 0x5ACB, 0x4208, 0x94B2, 0x632C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x634C, 0xE73C, 0xB596, 0xC618, 0xDEDB, // 0x01A0 (416) pixels + 0xD6BA, 0xAD75, 0xA514, 0x9492, 0x8430, 0x73AE, 0x6B6D, 0x6B4D, 0x528A, 0x4208, 0x9CD3, 0x5AEB, 0x0000, 0x0000, 0x0000, 0x0000, // 0x01B0 (432) pixels + 0x0000, 0x0000, 0x0000, 0x52AA, 0xE73C, 0xB596, 0xC618, 0xDEDB, 0xD6BA, 0xAD75, 0xA514, 0x9492, 0x8430, 0x7BCF, 0x6B4D, 0x52AA, // 0x01C0 (448) pixels + 0x4A49, 0x6B4D, 0x8C51, 0x52AA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3A07, 0x52AA, 0x8C51, 0xC618, 0xDEDB, // 0x01D0 (464) pixels + 0xD6BA, 0xAD75, 0xA514, 0x9492, 0x8430, 0x6B6D, 0x5ACB, 0x738E, 0x9492, 0x9CF3, 0x52AA, 0x4228, 0x0000, 0x0000, 0x0000, 0x0000, // 0x01E0 (480) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x2985, 0x52AA, 0x52AA, 0xAD55, 0xBDD7, 0xAD55, 0xAD55, 0xAD55, 0xAD55, 0xA514, 0x9CF3, 0x94B2, // 0x01F0 (496) pixels + 0x738E, 0x52AA, 0x4207, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2124, 0x39C6, 0x52AA, // 0x0200 (512) pixels + 0x52AA, 0x52AA, 0x52AA, 0x52AA, 0x52AA, 0x52AA, 0x52AA, 0x52AA, 0x3A07, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0210 (528) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0220 (544) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0230 (560) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0240 (576) pixels +}}; +} +} diff --git a/src/icons/buzzer.h b/src/icons/buzzer.h new file mode 100644 index 0000000..0b2fc96 --- /dev/null +++ b/src/icons/buzzer.h @@ -0,0 +1,46 @@ +#pragma once + +#include "icon.h" + +namespace { +namespace icons { +const Icon<24, 24> buzzer{{ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0010 (16) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0020 (32) pixels + 0xB5B5, 0xB595, 0xAD95, 0xB595, 0xAD95, 0xC5D6, 0xB5B5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0030 (48) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xAD95, 0xB5B5, 0xB595, 0xAD75, 0xAD75, 0xAD75, 0x6C72, 0xB5B5, 0x0000, // 0x0040 (64) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xB557, 0xAD94, // 0x0050 (80) pixels + 0xAD74, 0xBDF6, 0xDEDA, 0xDEDA, 0xBDF7, 0xAD95, 0xAD95, 0xBD97, 0x0000, 0x0000, 0x2109, 0x841F, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0060 (96) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xA533, 0x8C90, 0xBDF7, 0xEF5D, 0xA534, 0x73AE, 0x9CF3, 0xBDD6, 0xA554, 0xA534, // 0x0070 (112) pixels + 0xA534, 0x0000, 0x6D75, 0x6D74, 0x6D38, 0x6D19, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xAD55, 0x0000, 0xBDF7, // 0x0080 (128) pixels + 0xEF7D, 0xAD54, 0x6B6D, 0x7BEF, 0x6B8D, 0x9CF3, 0xAD75, 0xAD34, 0xAD34, 0x0000, 0x74F9, 0x74FA, 0x6D19, 0x6D18, 0x0000, 0x0000, // 0x0090 (144) pixels + 0xB5D6, 0xB5B5, 0xBDF6, 0xD4F8, 0xBDB6, 0xB5B5, 0xA554, 0xD6DA, 0xEF5D, 0x5AEB, 0x8C70, 0x8430, 0x7BEF, 0x6B6D, 0xB5B6, 0x9CF2, // 0x00A0 (160) pixels + 0x9D13, 0x42C4, 0x7519, 0x7519, 0x7519, 0x74F9, 0x81B5, 0x0000, 0xB5F6, 0xD6F8, 0xB5B5, 0xB5B5, 0xBDF6, 0xB5D6, 0xBDF6, 0xD6BA, // 0x00B0 (176) pixels + 0xAD54, 0x842F, 0x8C91, 0x8C50, 0x842F, 0x6B6D, 0xAD75, 0x9D13, 0x0000, 0xFDC0, 0x74F9, 0x7519, 0x74F9, 0x5599, 0x6D39, 0x0000, // 0x00C0 (192) pixels + 0x9CF2, 0xAD54, 0xD6B9, 0xE73C, 0xAD75, 0xBE17, 0xC638, 0xDEFB, 0x8C50, 0x94D2, 0x94B2, 0x8C91, 0x8450, 0x7BEF, 0x8430, 0xA554, // 0x00D0 (208) pixels + 0x94B1, 0x7CF8, 0x74F9, 0x74FA, 0x74F9, 0x74F9, 0x74F9, 0x0000, 0x5AEB, 0xB5B6, 0xF7BE, 0xBDD6, 0x8C71, 0xF79D, 0xAD95, 0xDEDA, // 0x00E0 (224) pixels + 0x8450, 0x9CD2, 0x9CD2, 0x94B2, 0x8C70, 0x842F, 0x6B6D, 0xB5B6, 0x8450, 0x7CD7, 0x74F9, 0x7519, 0x6CFA, 0x74F9, 0x74F9, 0x0000, // 0x00F0 (240) pixels + 0x7BEF, 0xBE17, 0xEF7D, 0x8C50, 0xAD75, 0xF79E, 0x9CF3, 0xCE99, 0x6B6D, 0x73CE, 0x8430, 0x94D2, 0x8C91, 0x8450, 0x73AE, 0xAD75, // 0x0100 (256) pixels + 0x8450, 0x8494, 0x74F9, 0x74F9, 0x74FA, 0x74F9, 0x74F9, 0x0000, 0x630B, 0xBDF7, 0xD69A, 0x738D, 0xBDF7, 0xE71C, 0x94D2, 0xC658, // 0x0110 (272) pixels + 0x8450, 0xAD75, 0x73CE, 0x94D2, 0x94B1, 0x8C50, 0x7BEE, 0xAD74, 0x842F, 0x8C50, 0x74F9, 0x74F9, 0x74FA, 0x74FA, 0x74FA, 0x0000, // 0x0120 (288) pixels + 0x5AEA, 0xB5B6, 0xBDD7, 0x6B6D, 0xB5D6, 0xCE79, 0x94B2, 0xC638, 0x7C0F, 0x94D2, 0x73AD, 0x9CD2, 0x94D2, 0x8C71, 0x7BEF, 0xA554, // 0x0130 (304) pixels + 0x7C0F, 0x8430, 0x74F9, 0x74F9, 0x74F9, 0x74F9, 0x74F9, 0x0000, 0x52CA, 0xA513, 0xAD75, 0x6B6C, 0xA534, 0xBDF7, 0x9491, 0xC638, // 0x0140 (320) pixels + 0x6B6C, 0x73AD, 0x6B8D, 0x9D13, 0x9CD2, 0x8C71, 0x7C0F, 0xA554, 0x73CE, 0x7C10, 0x74F9, 0x74FA, 0x74FA, 0x74F9, 0x74F9, 0x0000, // 0x0150 (336) pixels + 0x5ACA, 0x8430, 0x9D13, 0x6B8D, 0x7BEF, 0xB595, 0x8C91, 0xCE99, 0x630B, 0x630B, 0xA513, 0xA554, 0x9CF2, 0x8C91, 0x7C0F, 0xA533, // 0x0160 (352) pixels + 0x738D, 0x7496, 0x7519, 0x751A, 0x74F9, 0x7519, 0x7519, 0x0000, 0x52CA, 0x634C, 0x94B2, 0x7BCE, 0x5B0B, 0x9CF3, 0x8C71, 0xCE79, // 0x0170 (368) pixels + 0xB5B5, 0xB5D6, 0xB595, 0xA534, 0x9CF2, 0x8C91, 0x8430, 0xA533, 0x6B6C, 0x74B7, 0x74F9, 0x7554, 0x74F9, 0x7519, 0x7519, 0x0000, // 0x0180 (384) pixels + 0x0000, 0x5289, 0x6B4C, 0x7BCE, 0x632C, 0x5AEB, 0x840F, 0xC638, 0xB595, 0xAD95, 0xAD75, 0xA534, 0x9CF2, 0x8C91, 0x94B2, 0x8C71, // 0x0190 (400) pixels + 0x632C, 0x7496, 0x751A, 0x74F9, 0x74F9, 0x8539, 0x7D19, 0x0000, 0x0000, 0x0001, 0x4228, 0x4207, 0x4207, 0x3185, 0x5ACA, 0xB5D6, // 0x01A0 (416) pixels + 0xBDD6, 0xA554, 0xAD54, 0xA513, 0x94D2, 0x8C70, 0xAD74, 0x6B6D, 0x73AE, 0x69C0, 0x751A, 0x74FA, 0x7519, 0x751A, 0x665F, 0x0000, // 0x01B0 (432) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x2944, 0x94D2, 0xCE79, 0xA533, 0xA533, 0x9CF3, 0x94B2, 0x94B1, 0x9CF2, 0x630B, // 0x01C0 (448) pixels + 0x6B4C, 0x5AEB, 0x7519, 0x7519, 0x751A, 0x751A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4A89, // 0x01D0 (464) pixels + 0xC638, 0xBDD6, 0x9CF2, 0x9CD2, 0x94B1, 0xA534, 0x73CE, 0x0000, 0x630B, 0x0000, 0x6CFC, 0x6CFC, 0x7D55, 0x751A, 0x0000, 0x0000, // 0x01E0 (480) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6B4C, 0xCE79, 0xBDD6, 0xA513, 0xAD95, 0x94B1, 0x5B0B, 0x5B0B, // 0x01F0 (496) pixels + 0x632C, 0x0000, 0x5C57, 0x6CFB, 0x6CFB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4AA9, // 0x0200 (512) pixels + 0x52CA, 0x632C, 0xB5B6, 0xBDF6, 0x94B1, 0x4A69, 0x42E9, 0x5ACB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0210 (528) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5AEB, 0x52CA, 0x1884, 0x39C6, 0x39E7, 0x3A07, 0x52EA, 0x52AA, 0x0000, // 0x0220 (544) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0230 (560) pixels + 0x52AA, 0x52CA, 0x5AEB, 0x5ACB, 0x5ACA, 0x4A4A, 0x52AA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0240 (576) pixels +}}; +} +} diff --git a/src/icons/checked.h b/src/icons/checked.h new file mode 100644 index 0000000..14af376 --- /dev/null +++ b/src/icons/checked.h @@ -0,0 +1,46 @@ +#pragma once + +#include "icon.h" + +namespace { +namespace icons { +const Icon<24, 24> checked{{ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0010 (16) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0020 (32) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0030 (48) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0040 (64) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2945, 0x6B4D, 0x5AEB, 0x5AEB, // 0x0050 (80) pixels + 0x5AEB, 0x5AEB, 0x5AEB, 0x5AEB, 0x5AEB, 0x5AEB, 0x5AEB, 0x8BF1, 0x0240, 0x01E0, 0x02C0, 0x0280, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0060 (96) pixels + 0x0000, 0x0000, 0xA514, 0xA534, 0xA534, 0xBDD7, 0xBDF7, 0xBDF7, 0xBDF7, 0xBDF7, 0xBDF7, 0xBDF7, 0xBDF7, 0xBDF7, 0xBDF7, 0x8C91, // 0x0070 (112) pixels + 0x3807, 0x0000, 0x0000, 0x0260, 0x0260, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC618, 0xBDD7, 0xCE59, 0xAD75, 0xB596, 0xB596, // 0x0080 (128) pixels + 0xB596, 0xB596, 0xAD75, 0xAD75, 0xAD75, 0xB596, 0xAD75, 0x9CD3, 0x0300, 0x8E31, 0x00E0, 0x0240, 0x0260, 0x0000, 0x0000, 0x0000, // 0x0090 (144) pixels + 0x0000, 0x8431, 0xA534, 0xA514, 0xA534, 0xAD75, 0xAD75, 0xAD75, 0xAD75, 0xAD75, 0xAD75, 0xAD55, 0xAD75, 0xAD75, 0xA554, 0x5BEB, // 0x00A0 (160) pixels + 0x4508, 0xBF77, 0x1C43, 0x0240, 0x01C0, 0x02C0, 0x0000, 0x0000, 0x0000, 0x8C51, 0xFFFF, 0x9492, 0xCE59, 0xF7BE, 0xFFBF, 0xF79E, // 0x00B0 (176) pixels + 0xF79E, 0xF79E, 0xEF7D, 0xEF7D, 0xF7BE, 0xEF9D, 0x8D51, 0x34E6, 0xA6F4, 0xA734, 0xA6F4, 0x54EA, 0x02E0, 0x0240, 0x0000, 0x0000, // 0x00C0 (192) pixels + 0x0000, 0x7BCF, 0x0000, 0x8C72, 0x7C8F, 0x6CCD, 0xC698, 0xF79E, 0xEF7D, 0xEF7D, 0xEF5D, 0xF79E, 0xF79E, 0x8510, 0x34C6, 0x9EB3, // 0x00D0 (208) pixels + 0x9692, 0x9672, 0x9692, 0x44C8, 0x02E0, 0x0220, 0x0000, 0x0000, 0x0160, 0x632C, 0x02A0, 0x3B27, 0x3426, 0x8E30, 0x23C4, 0xCEB9, // 0x00E0 (224) pixels + 0xF77E, 0xEF7D, 0xF79E, 0xF79E, 0x8D51, 0x2463, 0x8E51, 0x8630, 0x8610, 0x8610, 0x44A8, 0x02A0, 0x0160, 0x0000, 0x0000, 0x0000, // 0x00F0 (240) pixels + 0x0240, 0x02A0, 0x0260, 0x1BA3, 0x75AD, 0x860F, 0x656B, 0x4C29, 0xCED9, 0xF7BE, 0xEF7D, 0x8D31, 0x2C24, 0x7E0E, 0x7DEE, 0x7DCE, // 0x0100 (256) pixels + 0x7DCE, 0x4CA9, 0x02A0, 0x1843, 0x0220, 0x0280, 0x0000, 0x0000, 0x0240, 0x0000, 0x0321, 0x6D6B, 0x75AC, 0x75AC, 0x75EC, 0x654A, // 0x0110 (272) pixels + 0x33A6, 0xCED9, 0x9D73, 0x3C26, 0x7E0D, 0x75CC, 0x75AC, 0x6D8C, 0x5CEA, 0x2AE5, 0x634D, 0x2288, 0x7BCE, 0x0000, 0x0000, 0x0000, // 0x0120 (288) pixels + 0x0260, 0x0220, 0x0200, 0x1361, 0x6549, 0x658A, 0x6DCA, 0x760B, 0x5CE8, 0x02E0, 0x33C4, 0x760B, 0x6DCA, 0x6DCA, 0x6DAA, 0x7D6D, // 0x0130 (304) pixels + 0x646C, 0x6B6D, 0x6B6E, 0x8C4E, 0x52AD, 0x0000, 0x0000, 0x0000, 0x0200, 0x5B0B, 0x0220, 0x2A85, 0x2B83, 0x6568, 0x5DC8, 0x65E8, // 0x0140 (320) pixels + 0x7649, 0x6D49, 0x75EA, 0x6E09, 0x65C8, 0x65A9, 0x6CEB, 0x3BA8, 0xE75C, 0x7BD0, 0x634D, 0x73B1, 0x5ACA, 0x0000, 0x0000, 0x0000, // 0x0150 (336) pixels + 0x0000, 0x5AAD, 0x000A, 0x630D, 0x5BCB, 0x2344, 0x65A6, 0x4D84, 0x55C4, 0x4DC4, 0x4DA3, 0x4D83, 0x4563, 0x4463, 0x1B83, 0xE73C, // 0x0160 (352) pixels + 0xFFDF, 0x7BF0, 0x6B4D, 0x7BEE, 0x52AC, 0x0000, 0x0000, 0x0000, 0x0000, 0x630E, 0x0010, 0x5AEC, 0xCE79, 0x9DB3, 0x1300, 0x5DC3, // 0x0170 (368) pixels + 0x4E01, 0x4E22, 0x4E21, 0x4E02, 0x5D24, 0x4388, 0xE73C, 0xF79E, 0xFFDF, 0x8410, 0x6B6E, 0x840D, 0x630E, 0x0000, 0x0000, 0x0000, // 0x0180 (384) pixels + 0x0000, 0x73AE, 0x8C6A, 0x630D, 0xC638, 0xFFFF, 0xADF5, 0x0B60, 0x6664, 0x56A1, 0x66C3, 0x5503, 0x3B48, 0xDF3B, 0xF7BE, 0xF79E, // 0x0190 (400) pixels + 0xFFDF, 0x8431, 0x73AF, 0x6B4F, 0x73AE, 0x0000, 0x0000, 0x0000, 0x0000, 0x738D, 0x5280, 0x6B4D, 0xC638, 0xFFFF, 0xFFFF, 0xA5D4, // 0x01A0 (416) pixels + 0x1280, 0x7F45, 0x5D83, 0x0300, 0xEF9D, 0xFFFF, 0xFFDF, 0xF7BE, 0xFFFF, 0x8C51, 0x7BCF, 0x7BF2, 0x738D, 0x0000, 0x0000, 0x0000, // 0x01B0 (432) pixels + 0x0000, 0x738D, 0x0000, 0x6B6E, 0xC638, 0xFFFF, 0xFFFF, 0xFFFF, 0x9572, 0x32A5, 0x53C9, 0xEF9D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, // 0x01C0 (448) pixels + 0xFFFF, 0x8C72, 0x7BF0, 0x8C53, 0x738D, 0x0000, 0x0000, 0x0000, 0x0000, 0x7BD0, 0xA510, 0x7BCF, 0xA535, 0xCE59, 0xCE59, 0xCE59, // 0x01D0 (464) pixels + 0xCE79, 0x84B0, 0xADB5, 0xCE59, 0xCE59, 0xCE59, 0xCE59, 0xCE59, 0xC638, 0x8C51, 0x8410, 0x8430, 0x7BD0, 0x0000, 0x0000, 0x0000, // 0x01E0 (480) pixels + 0x0000, 0x8C71, 0x8431, 0x8431, 0x7BF0, 0x7BF0, 0x7BF0, 0x7BF0, 0x7BF0, 0x8410, 0x83F0, 0x7BF0, 0x7BF0, 0x7BF0, 0x7BF0, 0x7BF0, // 0x01F0 (496) pixels + 0x7BF0, 0x8410, 0x8C51, 0x8431, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9CD3, 0x9492, 0xB593, 0x9493, 0x9491, 0x94B1, // 0x0200 (512) pixels + 0x94B1, 0x94B1, 0x94B1, 0x94B1, 0x94B1, 0x94B1, 0x94B1, 0x9491, 0x9CF3, 0x4200, 0x8430, 0x9492, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0210 (528) pixels + 0x0000, 0x0020, 0x0000, 0x630D, 0x8C71, 0x8C51, 0x8C51, 0x8C51, 0x8C51, 0x8C51, 0x8C51, 0x8C51, 0x8C51, 0x8C51, 0x8C51, 0x8C51, // 0x0220 (544) pixels + 0x8C71, 0x8410, 0x8C51, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0230 (560) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0240 (576) pixels +}}; +} +} diff --git a/src/icons/close.h b/src/icons/close.h new file mode 100644 index 0000000..88b29c3 --- /dev/null +++ b/src/icons/close.h @@ -0,0 +1,42 @@ +#pragma once + +#include "icon.h" + +namespace { +namespace icons { +const Icon<32, 32> close{{ +0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x30C3,0x4124,0x61C7,0x61C7,0x4124,0x30E3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // row 0, 32 pixels +0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x48E3,0xA249,0xEB8E,0xFCB2,0xFD14,0xFD75,0xFD96,0xFD34,0xFCF3,0xEBEF,0xA28A,0x4904,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // row 1, 64 pixels +0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x58E3,0xC228,0xFC10,0xFD34,0xFE18,0xFE59,0xFE79,0xFE9A,0xFE9A,0xFE9A,0xFE9A,0xFE59,0xFD75,0xFC51,0xC28A,0x5904,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // row 2, 96 pixels +0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2041,0x8945,0xF34D,0xFD34,0xFDB6,0xFD75,0xFD55,0xFD55,0xFD96,0xFDD7,0xFDF7,0xFDF7,0xFDB6,0xFDB6,0xFDD7,0xFDF7,0xFD75,0xF38E,0x8965,0x2041,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // row 3, 128 pixels +0x0000,0x0000,0x0000,0x0000,0x0000,0x4082,0xE208,0xF410,0xFD34,0xFC92,0xFBEF,0xFBAE,0xFBEF,0xFC71,0xFD14,0xFD75,0xFDB6,0xFD75,0xFD14,0xFC92,0xFC51,0xFC71,0xFCF3,0xFD75,0xFC30,0xEA28,0x40A2,0x0000,0x0000,0x0000,0x0000,0x0000, // row 4, 160 pixels +0x0000,0x0000,0x0000,0x0000,0x3861,0xE1E7,0xF451,0xFC92,0xFB4D,0xFA49,0xFA49,0xFAEB,0xFBAE,0xFC71,0xFD34,0xFDB6,0xFE18,0xFDB6,0xFD34,0xFC71,0xFBAE,0xFB0C,0xFAEB,0xFBAE,0xFCD3,0xFC71,0xE208,0x4082,0x0000,0x0000,0x0000,0x0000, // row 5, 192 pixels +0x0000,0x0000,0x0000,0x1020,0xD986,0xF430,0xFC30,0xFA28,0xF924,0xF965,0xFA8A,0xFB0C,0xFBAE,0xFC51,0xFD14,0xFD75,0xFDB6,0xFD75,0xFD14,0xFC51,0xFC71,0xFBEF,0xFA28,0xF9C7,0xFA8A,0xFC51,0xF430,0xD9A6,0x1020,0x0000,0x0000,0x0000, // row 6, 224 pixels +0x0000,0x0000,0x0000,0x78A2,0xEB6D,0xFC30,0xF9C7,0xF861,0xF8A2,0xFA08,0xFEDB,0xFD55,0xFB4D,0xFC10,0xFC92,0xFD14,0xFD34,0xFD14,0xFC92,0xFCB2,0xFF7D,0xFF7D,0xFB2C,0xF945,0xF8E3,0xF9E7,0xFC30,0xEB8E,0x78C3,0x0000,0x0000,0x0000, // row 7, 256 pixels +0x0000,0x0000,0x3841,0xD9E7,0xF492,0xF208,0xF041,0xF800,0xF945,0xFE9A,0xFFFF,0xFFFF,0xFD75,0xFB8E,0xFC10,0xFC51,0xFC71,0xFC51,0xFCB2,0xFF7D,0xFFFF,0xFFFF,0xFF3C,0xFA8A,0xF882,0xF841,0xFA08,0xFC92,0xDA08,0x3841,0x0000,0x0000, // row 8, 288 pixels +0x0000,0x0000,0x88A2,0xEBCF,0xF2EB,0xF061,0xF000,0xF8E3,0xFE79,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFD75,0xFB4D,0xFBAE,0xFBAE,0xFC71,0xFF7D,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFEFB,0xFA28,0xF800,0xF061,0xF2EB,0xEBEF,0x90C3,0x0000,0x0000, // row 9, 320 pixels +0x0000,0x2820,0xD1C7,0xF410,0xE945,0xE800,0xF000,0xFE9A,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFD34,0xFAEB,0xFBCF,0xFF5D,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFF1C,0xF986,0xF000,0xF145,0xF410,0xD1E7,0x2820,0x0000, // row 10, 352 pixels +0x0000,0x6841,0xDB2C,0xEACB,0xE041,0xE800,0xF000,0xFEFB,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFD14,0xFF1C,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFBCF,0xF082,0xF000,0xE841,0xEACB,0xE34D,0x7061,0x0000, // row 11, 384 pixels +0x0000,0x9861,0xE3CF,0xE186,0xE000,0xE800,0xE800,0xF145,0xFEDB,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFB8E,0xF000,0xF000,0xE800,0xE800,0xE986,0xEBCF,0xA082,0x0000, // row 12, 416 pixels +0x0800,0xB8A2,0xE3AE,0xD8A2,0xD800,0xE000,0xE800,0xE800,0xF145,0xFEFB,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFB8E,0xF000,0xF000,0xE800,0xE800,0xE000,0xE0A2,0xEBAE,0xC0C3,0x0800, // row 13, 448 pixels +0x1800,0xC124,0xE30C,0xD020,0xD800,0xE000,0xE000,0xE800,0xE800,0xF145,0xFEDB,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFB8E,0xF000,0xF000,0xE800,0xE800,0xE000,0xE000,0xD820,0xE30C,0xC124,0x1800, // row 14, 480 pixels +0x2800,0xC165,0xDAAA,0xC800,0xD000,0xD800,0xE000,0xE000,0xE800,0xE800,0xF124,0xFE79,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFB6D,0xF000,0xF000,0xE800,0xE800,0xE000,0xE000,0xD800,0xD000,0xDAAA,0xC165,0x2800, // row 15, 512 pixels +0x2000,0xB924,0xD269,0xC800,0xD000,0xD000,0xD800,0xE000,0xE000,0xE800,0xE924,0xFEFB,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF36D,0xE800,0xE800,0xE800,0xE000,0xE000,0xD800,0xD000,0xD000,0xDA69,0xC145,0x2800, // row 16, 544 pixels +0x1000,0xB0A2,0xD28A,0xC000,0xC800,0xD000,0xD000,0xD800,0xD800,0xE165,0xFEFB,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF3AE,0xE000,0xE000,0xD800,0xD800,0xD000,0xD000,0xC800,0xD28A,0xB8C3,0x1000, // row 17, 576 pixels +0x0000,0xA800,0xD2AA,0xB800,0xC000,0xC800,0xC800,0xD000,0xD965,0xFEFB,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xEBAE,0xD800,0xD800,0xD000,0xC800,0xC800,0xC000,0xD2AA,0xB020,0x0000, // row 18, 608 pixels +0x0000,0x8000,0xCA69,0xB841,0xB800,0xC000,0xC800,0xD186,0xFEFB,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xEBCF,0xD000,0xC800,0xC800,0xC000,0xC041,0xCA69,0x8000,0x0000, // row 19, 640 pixels +0x0000,0x4800,0xC1C7,0xB8E3,0xB800,0xB800,0xC000,0xF69A,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xEBEF,0xFE79,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xE410,0xC841,0xC000,0xB800,0xC0E3,0xC1C7,0x4800,0x0000, // row 20, 672 pixels +0x0000,0x1000,0xB061,0xC1E7,0xB000,0xB000,0xB800,0xD269,0xFFBE,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xE38E,0xD000,0xD965,0xF69A,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xDB0C,0xC020,0xB800,0xB000,0xC1E7,0xB061,0x1000,0x0000, // row 21, 704 pixels +0x0000,0x0000,0x6000,0xB9C7,0xB061,0xB000,0xB000,0xB800,0xCA49,0xFF9E,0xFFFF,0xFFFF,0xFFFF,0xE38E,0xC800,0xC800,0xC800,0xD186,0xF69A,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xDB0C,0xB800,0xB800,0xB000,0xB061,0xC1C7,0x6000,0x0000,0x0000, // row 22, 736 pixels +0x0000,0x0000,0x1800,0xB041,0xB986,0xA800,0xA800,0xB000,0xB000,0xCA49,0xFF7D,0xFFFF,0xDB8E,0xC000,0xC000,0xC000,0xC000,0xC000,0xC986,0xF6DB,0xFFFF,0xFFFF,0xD30C,0xB800,0xB000,0xB000,0xA800,0xB986,0xB041,0x1800,0x0000,0x0000, // row 23, 768 pixels +0x0000,0x0000,0x0000,0x5800,0xB0E3,0xA8C3,0xA800,0xA800,0xA800,0xB000,0xCACB,0xD38E,0xB000,0xB800,0xB800,0xB800,0xB800,0xB800,0xB800,0xC145,0xF6DB,0xD34D,0xB000,0xB000,0xA800,0xA800,0xB0C3,0xB0E3,0x5800,0x0000,0x0000,0x0000, // row 24, 800 pixels +0x0000,0x0000,0x0000,0x0000,0x6000,0xB124,0xA882,0xA000,0xA800,0xA800,0xA800,0xA800,0xB000,0xB000,0xB000,0xB000,0xB000,0xB000,0xB000,0xB000,0xB000,0xA800,0xA800,0xA800,0xA800,0xA882,0xB124,0x6000,0x0000,0x0000,0x0000,0x0000, // row 25, 832 pixels +0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0xB104,0xA882,0xA000,0xA000,0xA000,0xA800,0xA800,0xA800,0xA800,0xA800,0xA800,0xA800,0xA800,0xA800,0xA800,0xA800,0xA000,0xA000,0xA882,0xB104,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000, // row 26, 864 pixels +0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0xB0A2,0xA8C3,0xA020,0xA000,0xA000,0xA000,0xA000,0xA000,0xA000,0xA000,0xA000,0xA000,0xA000,0xA000,0xA000,0xA020,0xA8C3,0xB0A2,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // row 27, 896 pixels +0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4800,0xA800,0xB0C3,0xA0A2,0x9800,0x9800,0x9800,0x9800,0xA000,0xA000,0xA000,0x9800,0x9800,0x9800,0xA082,0xB0E3,0xA800,0x4800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // row 28, 928 pixels +0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x5800,0xA800,0xB0A2,0xA8E3,0xA0A2,0xA041,0x9800,0x9800,0xA041,0xA0A2,0xA8E3,0xB0A2,0xA800,0x5800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // row 29, 960 pixels +0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x6000,0x8800,0xA000,0xA800,0xA800,0xA000,0x8800,0x6000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // row 30, 992 pixels +0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // row 31, 1024 pixels +}}; +} +} diff --git a/src/icons/demos.h b/src/icons/demos.h new file mode 100644 index 0000000..789583b --- /dev/null +++ b/src/icons/demos.h @@ -0,0 +1,46 @@ +#pragma once + +#include "icon.h" + +namespace { +namespace icons { +const Icon<24, 24> demos{{ + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0010 (16) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0020 (32) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x8451, 0xAD75, 0xEF7D, // 0x0030 (48) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x9CB3, 0x9CD3, 0x9CB3, 0x94B2, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0040 (64) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0x3186, 0x9CD3, 0xF79E, 0xBDD7, 0xEF5D, 0xFFFF, 0xFFFF, 0xFFFF, 0x8C71, 0x9472, 0x8C51, 0x83EF, 0x7BAF, // 0x0050 (80) pixels + 0x7BAE, 0x7BCF, 0x83EF, 0x8410, 0x8C30, 0x8430, 0x8410, 0x8410, 0xFFFF, 0x2104, 0x5AAA, 0x5AEB, 0x8410, 0x7BEF, 0xAD55, 0xFFFF, // 0x0060 (96) pixels + 0xFFFF, 0xFFFF, 0x8430, 0x7BCF, 0x632C, 0x5ACB, 0x5AAA, 0x5ACB, 0x5AAA, 0x528A, 0x52AA, 0x528A, 0x528A, 0x526A, 0x5AAA, 0x8410, // 0x0070 (112) pixels + 0x8430, 0x5AEB, 0x2124, 0x2945, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x7BEF, 0x6B6D, 0x528A, 0x4A49, 0x528A, 0x4A69, 0x4228, // 0x0080 (128) pixels + 0x4228, 0x4208, 0x39E7, 0x31A6, 0x52AA, 0x738E, 0x7BCF, 0x4A69, 0x0861, 0x1062, 0x3166, 0x5AAA, 0x5AAA, 0x5AAA, 0x4A49, 0xFFFF, // 0x0090 (144) pixels + 0x73AE, 0x6B4D, 0x526A, 0x4208, 0x4228, 0x39C7, 0x3186, 0x3186, 0x2945, 0x2944, 0x52AA, 0x738E, 0x6B8E, 0x39C7, 0x1082, 0x1082, // 0x00A0 (160) pixels + 0x0881, 0x31C6, 0x3186, 0x18E3, 0x2104, 0x39A6, 0x526A, 0x4208, 0x736D, 0x5AAA, 0x4208, 0x39C7, 0x39A6, 0x18C3, 0x1082, 0x2104, // 0x00B0 (176) pixels + 0x5ACB, 0x73CF, 0x528A, 0x2124, 0x0861, 0x0861, 0x1903, 0x18C3, 0x18C3, 0x2104, 0x2104, 0x2924, 0x39A7, 0x39E7, 0x2124, 0x1082, // 0x00C0 (192) pixels + 0x5ACB, 0x528A, 0x39C7, 0x3165, 0x18E3, 0x4228, 0x8431, 0x6B6D, 0x39E7, 0x1082, 0x0020, 0x0020, 0x0861, 0x1081, 0x1082, 0x18C3, // 0x00D0 (208) pixels + 0x2924, 0x3186, 0x41E7, 0x39E7, 0x2924, 0x18A2, 0xFFFF, 0xFFFF, 0x2945, 0x5ACB, 0x39E7, 0x39C7, 0xD69A, 0xE71C, 0x7BEF, 0x1082, // 0x00E0 (224) pixels + 0x0861, 0x1082, 0x2104, 0x20E3, 0x2104, 0x2945, 0x31A6, 0x4208, 0x4228, 0x4208, 0x2104, 0x1082, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x00F0 (240) pixels + 0x18E3, 0x2124, 0x4228, 0x5AAB, 0x738E, 0x2945, 0x20E4, 0x18E3, 0x3186, 0x3165, 0x3186, 0x3186, 0x39C7, 0x4A28, 0x528A, 0x528A, // 0x0100 (256) pixels + 0x4A49, 0x52AA, 0x2985, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x18A3, 0x18C3, 0x4A28, 0x4208, 0x5269, 0x4A49, // 0x0110 (272) pixels + 0x4A49, 0x4A69, 0x5ACA, 0x6B6D, 0x7BEF, 0x8C51, 0x8C71, 0x8C71, 0x9CD3, 0x94D3, 0x4A69, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0120 (288) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xB5B6, 0x0841, 0x5ACB, 0x9CD3, 0xCE59, 0xD6BA, 0xD6BA, 0xD6BA, 0xC618, 0xC618, 0xDEDB, 0xC618, // 0x0130 (304) pixels + 0x8410, 0x2945, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xAD75, 0x0000, 0x0841, 0x18C3, // 0x0140 (320) pixels + 0x4A49, 0x738E, 0x8C51, 0x9CD3, 0xA514, 0x9CD3, 0x6B4D, 0x2945, 0x1082, 0x0861, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0150 (336) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x18C3, 0x0861, 0x10A2, 0x2124, 0x39E7, 0x528A, 0x6B6D, 0x8410, 0x738E, 0x5AEB, 0x4A49, 0x3165, // 0x0160 (352) pixels + 0x18E3, 0x18C2, 0x0861, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0861, 0x10A2, 0x1082, 0x2124, // 0x0170 (368) pixels + 0x4228, 0x62EB, 0x73AF, 0x8451, 0x7BCF, 0x632D, 0x526A, 0x3186, 0x18C3, 0x10A2, 0x18C3, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0180 (384) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0x10A2, 0x2104, 0x0861, 0x0882, 0x2124, 0x4208, 0x5AEB, 0x73AF, 0x8451, 0x7BCF, 0x632C, 0x5269, 0x3186, // 0x0190 (400) pixels + 0x18A2, 0x1061, 0x18E3, 0x10A2, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x10A2, 0x18C3, 0x0020, 0x0861, 0x2924, // 0x01A0 (416) pixels + 0x4208, 0x5AEB, 0x73AF, 0x8451, 0x7BCF, 0x632C, 0x5269, 0x3186, 0x10A2, 0x0841, 0x10A2, 0x10A2, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x01B0 (432) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0x10A2, 0x0841, 0x0020, 0x1082, 0x2124, 0x4208, 0x5AEB, 0x73AF, 0x8451, 0x7BCF, 0x632C, 0x5269, 0x3186, // 0x01C0 (448) pixels + 0x18C3, 0x0861, 0x0020, 0x10A2, 0x3186, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x52AA, 0x2945, 0x0861, 0x0841, 0x18E3, 0x2965, // 0x01D0 (464) pixels + 0x4228, 0x62EB, 0x73AF, 0x8451, 0x7BCF, 0x6B2D, 0x528A, 0x39C7, 0x2124, 0x1082, 0x0000, 0x2945, 0x52AA, 0xFFFF, 0xFFFF, 0xFFFF, // 0x01E0 (480) pixels + 0xFFFF, 0xFFFF, 0x738E, 0x7BCF, 0x4A69, 0x0020, 0x0861, 0x2965, 0x4A69, 0x630C, 0x73AE, 0x8431, 0x7BCF, 0x632D, 0x5AAA, 0x39E7, // 0x01F0 (496) pixels + 0x18A2, 0x0020, 0x2965, 0x7BCF, 0x738E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x8430, 0x9CF3, 0x9492, 0x4A69, 0x2124, // 0x0200 (512) pixels + 0x2124, 0x39C7, 0x4A6A, 0x630C, 0x52AB, 0x4208, 0x2965, 0x2124, 0x39E7, 0x8410, 0xA514, 0x8430, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0210 (528) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x9CF3, 0xB5B6, 0xC638, 0xC638, 0xB596, 0xA514, 0x9CD3, 0x94B2, 0x9CD3, 0xA514, 0xAD75, 0xC618, // 0x0220 (544) pixels + 0xC638, 0xBDD7, 0xA514, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xCE79, // 0x0230 (560) pixels + 0xD6DA, 0xDEFB, 0xE71C, 0xE73C, 0xE71C, 0xE71C, 0xDEDB, 0xD69A, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0240 (576) pixels +}}; +} +} diff --git a/src/icons/graph.h b/src/icons/graph.h new file mode 100644 index 0000000..f613457 --- /dev/null +++ b/src/icons/graph.h @@ -0,0 +1,46 @@ +#pragma once + +#include "icon.h" + +namespace { +namespace icons { +const Icon<24, 24> graph{{ + 0x0000, 0x7BCF, 0x7BCF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0010 (16) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7BCF, 0x7BCF, 0x7BCF, 0x7BCF, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0020 (32) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0030 (48) pixels + 0x7BCF, 0x7BCF, 0x7BCF, 0x7BCF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0040 (64) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7BCF, 0x7BCF, 0x7BCF, 0x7BCF, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0050 (80) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0060 (96) pixels + 0x7BCF, 0x7BCF, 0x7BCF, 0x7BCF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0070 (112) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7BCF, 0x7BCF, 0x7BCF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0080 (128) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7D7E, 0x7D7E, 0x7D9F, 0x0000, 0x0000, 0x0000, // 0x0090 (144) pixels + 0x7BCF, 0x7BCF, 0x7BCF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5CFE, // 0x00A0 (160) pixels + 0x651E, 0x6D3E, 0x651E, 0x755E, 0x859F, 0x0000, 0x0000, 0x0000, 0x7BCF, 0x7BCF, 0x7BCF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x00B0 (176) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x01BD, 0x651E, 0x02FE, 0x651E, 0x6D3E, 0x859E, 0x95FF, 0x755F, 0x0000, 0x0000, 0x0000, // 0x00C0 (192) pixels + 0x7BCF, 0x7BCF, 0x7BCF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x54DE, 0x5CDE, 0x6D3E, // 0x00D0 (208) pixels + 0x8DBF, 0xB69F, 0xD71F, 0xDF5F, 0x54DE, 0x0000, 0x0000, 0x0000, 0x7BCF, 0x7BCF, 0x7BCF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x00E0 (224) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4C7E, 0x6D1E, 0xBEDF, 0xEF9F, 0xF7BF, 0xF7DF, 0xF7DF, 0x5CFE, 0x0000, 0x0000, 0x0000, // 0x00F0 (240) pixels + 0x7BCF, 0x7BCF, 0x7BCF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xB12A, 0xB12A, 0xE002, 0x345E, 0x4C9E, 0x95FF, 0xEFBF, // 0x0100 (256) pixels + 0xF7DF, 0xF7BF, 0xEFBF, 0xEFBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x7BCF, 0x7BCF, 0x7BCF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0110 (272) pixels + 0xA8E9, 0xB9AC, 0xA044, 0x3B9F, 0x343E, 0x64FE, 0xC6DF, 0xEFBF, 0xEF9F, 0xEF9F, 0xE77F, 0xDF5F, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0120 (288) pixels + 0x7BCF, 0x7BCF, 0x7BCF, 0x0000, 0x0000, 0x0000, 0x0000, 0xB10A, 0xC24F, 0xB10A, 0xB10A, 0xB8A8, 0x3C7E, 0x8DDF, 0xDF7F, 0xE77F, // 0x0130 (304) pixels + 0xDF7F, 0xDF5F, 0xD71F, 0xCF1F, 0x0000, 0x0000, 0x0000, 0x0000, 0x7BCF, 0x7BCF, 0x7BCF, 0x0000, 0x0000, 0xA8E9, 0xB12B, 0xA8A8, // 0x0140 (320) pixels + 0xB12A, 0xCAF0, 0xCB52, 0xA9CF, 0x5CBE, 0xAE7F, 0xDF5F, 0xCF1F, 0xCEFF, 0xC6FF, 0xC6FF, 0xC6FF, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0150 (336) pixels + 0x7BCF, 0x7BCF, 0x7BCF, 0x0000, 0xB10A, 0xB16C, 0xA8A8, 0xB18B, 0xCB72, 0xF61B, 0xF69C, 0xBB34, 0x845B, 0xB6BF, 0xBEBF, 0xBEBF, // 0x0160 (352) pixels + 0xBEBF, 0xBEBF, 0xBEDF, 0xC6DF, 0xB00A, 0x0000, 0x0000, 0x0000, 0x7BCF, 0x7BCF, 0x7BCF, 0xC808, 0xD2B6, 0xA8E9, 0xB9ED, 0xDC15, // 0x0170 (368) pixels + 0xF65D, 0xFEFE, 0xFEFE, 0xDD5A, 0xB355, 0xB5FE, 0xB69F, 0xB69F, 0xB69F, 0xB6BF, 0xBEBF, 0xBE1E, 0xB009, 0x0000, 0x0000, 0x0000, // 0x0180 (384) pixels + 0x7BCF, 0x7BCF, 0x7BCF, 0xC808, 0xB12B, 0xC250, 0xE458, 0xFDDD, 0xFE3E, 0xFE5E, 0xF65D, 0xEE1D, 0xDBF7, 0xB3F8, 0xAE5F, 0xAE7F, // 0x0190 (400) pixels + 0xAE9F, 0xB65F, 0xB47B, 0xBAB7, 0xB00F, 0x0000, 0x0000, 0x0000, 0x7BCF, 0x7BCF, 0x7BCF, 0xA002, 0xDB55, 0xECDB, 0xFDBE, 0xFDDE, // 0x01A0 (416) pixels + 0xFDDE, 0xF5DE, 0xEDDD, 0xF5FD, 0xF59B, 0xCB16, 0xACFC, 0xA65F, 0xAD7D, 0xB358, 0xD377, 0xEC98, 0xA813, 0x0000, 0x0000, 0x0000, // 0x01B0 (432) pixels + 0x7BCF, 0x7BCF, 0x7BCF, 0x1018, 0xED5E, 0xF59F, 0xED9F, 0xED9E, 0xE59E, 0xEDBE, 0xF5DE, 0xFDFD, 0xFE1D, 0xECBA, 0xBAD7, 0xABFA, // 0x01C0 (448) pixels + 0xC2D7, 0xE459, 0xFE3B, 0xFE9B, 0xA813, 0x0000, 0x0000, 0x0000, 0x7BCF, 0x7BCF, 0x7BCE, 0x001F, 0xC4FF, 0xED5F, 0xED7F, 0xF59F, // 0x01D0 (464) pixels + 0xFDBE, 0xFDDE, 0xFDDE, 0xFDFE, 0xFDFD, 0xFDFD, 0xDBD9, 0xD338, 0xF55B, 0xFE5C, 0xFE7C, 0xFE7C, 0x6B8D, 0x7BCF, 0x0000, 0x0000, // 0x01E0 (480) pixels + 0x0000, 0x7BCF, 0x7BCF, 0xB587, 0xED5F, 0xFD7F, 0xFD9F, 0xFD9F, 0xFDBF, 0xFDBE, 0xFDDE, 0xFDDE, 0xFDFE, 0xFE1D, 0xFDFD, 0xFDFD, // 0x01F0 (496) pixels + 0xFE5D, 0xFE5C, 0xFE5C, 0xFE7C, 0x636D, 0x7BCF, 0x7BCF, 0x0000, 0x0000, 0x7BCF, 0x7BCF, 0x7BCF, 0xD4FA, 0xE51C, 0xDD1B, 0xE53C, // 0x0200 (512) pixels + 0xE53C, 0xDD5B, 0xDD5B, 0xE57B, 0xE57B, 0xDD7A, 0xE59A, 0xE5BA, 0xE5BA, 0xDDB9, 0xE5D9, 0xD578, 0x73AE, 0x7BCF, 0x7BCF, 0x0000, // 0x0210 (528) pixels + 0x0000, 0x7BCF, 0x7BCF, 0x7BCF, 0x7BCF, 0x7BCF, 0x7BCF, 0x7BCF, 0x7BCF, 0x7BCF, 0x7BCF, 0x7BCF, 0x7BCF, 0x7BCF, 0x7BCF, 0x7BCF, // 0x0220 (544) pixels + 0x7BCF, 0x7BCF, 0x7BCF, 0x7BCF, 0x7BCF, 0x7BCF, 0x7BCF, 0x0000, 0x0000, 0x7BCF, 0x7BCF, 0x7BCF, 0x7BCF, 0x738E, 0x7BCF, 0x7BCF, // 0x0230 (560) pixels + 0x7BCF, 0x7BCF, 0x7BCF, 0x7BCF, 0x7BCF, 0x7BCF, 0x7BCF, 0x7BCF, 0x7BCF, 0x7BCF, 0x738E, 0x7BCF, 0x7BCF, 0x7BCF, 0x7BCF, 0x0000, // 0x0240 (576) pixels +}}; +} +} diff --git a/src/icons/hardware.h b/src/icons/hardware.h new file mode 100644 index 0000000..9b8db44 --- /dev/null +++ b/src/icons/hardware.h @@ -0,0 +1,46 @@ +#pragma once + +#include "icon.h" + +namespace { +namespace icons { +const Icon<24, 24> hardware{{ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0010 (16) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0020 (32) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0041, 0x0000, 0x0000, 0x0000, 0x8B00, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0030 (48) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x18C3, 0x0000, 0x0000, 0x0000, 0x20E1, 0x6A80, // 0x0040 (64) pixels + 0x7AC0, 0x20A0, 0x0000, 0x1880, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0840, 0x0000, 0x0000, 0x0000, // 0x0050 (80) pixels + 0x0001, 0x1062, 0x10A2, 0x18C3, 0x2945, 0x31A7, 0x5AC8, 0xABE3, 0xB380, 0x7260, 0x1020, 0x6220, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0060 (96) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4180, 0x8300, 0x6A62, 0x2966, 0x4A69, 0x6B4D, 0x7BCF, 0x8C51, 0x9492, 0x7BEE, // 0x0070 (112) pixels + 0xA3C3, 0xBBE0, 0x7A60, 0x0040, 0x5A00, 0x18C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x8B00, 0xCC42, // 0x0080 (128) pixels + 0x9385, 0x4225, 0x4A49, 0x9492, 0x9CD3, 0x9CD3, 0x9CD3, 0x9CD3, 0x7BEE, 0xA3C3, 0xCC20, 0x8A80, 0x0000, 0x0000, 0x20A0, 0x0000, // 0x0090 (144) pixels + 0x0000, 0x0000, 0x0000, 0x1880, 0x0000, 0x0000, 0x9340, 0xCC42, 0xD4A1, 0xC402, 0x5224, 0x4A69, 0x94B2, 0x9CD3, 0x9CD3, 0x9CD3, // 0x00A0 (160) pixels + 0x9CD3, 0x8C0D, 0x8324, 0xBC20, 0x8280, 0x0000, 0x5140, 0x0000, 0x0000, 0x0000, 0x0000, 0x1880, 0x0000, 0x5160, 0xB3A0, 0xBBE0, // 0x00B0 (176) pixels + 0xBBE1, 0xC484, 0xB3E3, 0x5225, 0x4A6A, 0x8C71, 0x9CD3, 0x9CF3, 0x94B2, 0x8C51, 0x736A, 0x9B63, 0xCC00, 0x92E0, 0x20A0, 0x0000, // 0x00C0 (192) pixels + 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x28A0, 0x59A0, 0xB3C0, 0xBBA0, 0xD480, 0xB424, 0xB443, 0x6AA4, 0x4A6A, 0x7BCF, 0x630C, // 0x00D0 (208) pixels + 0x4A69, 0x39E7, 0x31A7, 0x5A87, 0xA3A4, 0xAB84, 0x69C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1860, 0x0020, 0x28A0, 0x69A0, // 0x00E0 (224) pixels + 0x8B00, 0xD480, 0xC420, 0xBBE3, 0xA3E5, 0x6285, 0x31A6, 0x4208, 0x4A49, 0x5ACB, 0x632C, 0x6B6E, 0x73AF, 0x7B4A, 0x7220, 0x0000, // 0x00F0 (240) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3922, 0x0000, 0x8260, 0xA300, 0xB3C0, 0xB402, 0xCC63, 0xA3E8, 0x736D, 0x6B6D, // 0x0100 (256) pixels + 0x738E, 0x6B4D, 0x5AEB, 0x528A, 0x39E8, 0x51E4, 0x7200, 0x28A0, 0x0000, 0x0000, 0x0000, 0x18E3, 0xBDF7, 0x0000, 0x0000, 0x0000, // 0x0110 (272) pixels + 0x4229, 0x7A40, 0xAB20, 0xB3C0, 0x9B04, 0x5AEB, 0x5AEB, 0x4A69, 0x39C7, 0x2945, 0x18C3, 0x0861, 0x0000, 0x0000, 0x0000, 0x2880, // 0x0120 (288) pixels + 0x0000, 0x0000, 0x2965, 0x528A, 0x6B4D, 0x8410, 0xAD55, 0xCE59, 0xDEDB, 0x94B2, 0x5180, 0xCC20, 0x71E0, 0x5B0C, 0x630C, 0x0000, // 0x0130 (304) pixels + 0x0000, 0x2945, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7BEF, 0xD69A, 0xDEDB, 0xE73C, 0xE71C, 0xDEFB, // 0x0140 (320) pixels + 0xDEDB, 0xDEDB, 0xA4F3, 0x838C, 0x9491, 0xCE59, 0xDEFB, 0x8C71, 0x0000, 0x4A69, 0x0000, 0x0841, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0150 (336) pixels + 0x0000, 0x0000, 0x9492, 0xFFFF, 0xE73C, 0xE71C, 0xE71C, 0xDEFB, 0xDEFB, 0xDEDB, 0xD6BA, 0xD69A, 0xD6BA, 0xD69A, 0xE71C, 0xDEFB, // 0x0160 (352) pixels + 0x8C71, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8430, 0xF7BE, 0xF79E, 0xE73C, 0xE71C, 0xE71C, // 0x0170 (368) pixels + 0xDEFB, 0xDEFB, 0xDEDB, 0xDEDB, 0xD6BA, 0xD6BA, 0xE71C, 0xE73C, 0xDEFB, 0x8410, 0x0000, 0x39C7, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0180 (384) pixels + 0x0000, 0x0000, 0x7BCF, 0xE73C, 0xEF7D, 0xF79E, 0xE73C, 0xE71C, 0xE71C, 0xDEFB, 0xDEFB, 0xDEDB, 0xDEDB, 0xDEFB, 0xE71C, 0xE71C, // 0x0190 (400) pixels + 0xE73C, 0xE71C, 0x7BCF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3186, 0xB596, 0xE71C, 0xEF7D, 0xF7BE, 0xE73C, // 0x01A0 (416) pixels + 0xE71C, 0xE71C, 0xE71C, 0xE73C, 0xE73C, 0xE73C, 0xE73C, 0xE73C, 0xEF5D, 0xF79E, 0x94B2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x01B0 (432) pixels + 0x0000, 0x0000, 0x0000, 0x39E7, 0xB5B6, 0xDEFB, 0xEF7D, 0xF79E, 0xEF5D, 0xEF5D, 0xE73C, 0xE71C, 0xE71C, 0xE71C, 0xE73C, 0xE75C, // 0x01C0 (448) pixels + 0xE73C, 0xE75C, 0x9492, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x528A, 0xB5B6, 0xDEFB, 0xEF7D, // 0x01D0 (464) pixels + 0xE73C, 0xDEDB, 0xDEFB, 0xDEFB, 0xE71C, 0xE73C, 0xEF5D, 0xDF3B, 0x760E, 0xB696, 0x83F0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x01E0 (480) pixels + 0x0000, 0x0000, 0x0000, 0x18C3, 0x0000, 0x39E7, 0xAD75, 0xE71C, 0xE71C, 0xDEFB, 0xE71C, 0xE71C, 0xEF5D, 0xEF5D, 0xDEFB, 0xC618, // 0x01F0 (496) pixels + 0x8C91, 0x6B6D, 0x39C7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x39E7, 0xB5B6, // 0x0200 (512) pixels + 0xDEFB, 0xDEFB, 0xDEDB, 0xD69A, 0xAD75, 0x8430, 0x528A, 0x0000, 0x0000, 0x0000, 0x2965, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0210 (528) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4A49, 0xA514, 0x94B2, 0x738E, 0x2945, 0x0000, 0x0000, 0x0000, 0x2124, // 0x0220 (544) pixels + 0x1082, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1082, 0x0000, // 0x0230 (560) pixels + 0x1082, 0x0000, 0x0000, 0x0000, 0x630C, 0x1082, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0240 (576) pixels +}}; +} +} diff --git a/src/icons/info.h b/src/icons/info.h new file mode 100644 index 0000000..34b479c --- /dev/null +++ b/src/icons/info.h @@ -0,0 +1,46 @@ +#pragma once + +#include "icon.h" + +namespace { +namespace icons { +const Icon<24, 24> info{{ + 0x0000, 0x0000, 0x0000, 0x7BEF, 0xE73C, 0xFFFF, 0xFFFF, 0xEF9E, 0xDF3D, 0xC6BC, 0xBE9C, 0xBE9C, 0xC69C, 0xBE9C, 0xCEDD, 0xE75E, // 0x0010 (16) pixels + 0xEF9E, 0xFFFF, 0xFFFF, 0xF77D, 0xFFDF, 0x73AE, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xB65B, 0x8D79, // 0x0020 (32) pixels + 0x8D9A, 0x95BA, 0x9DDB, 0xA5FB, 0xA61B, 0x9DFB, 0x9DDA, 0x95BA, 0x959A, 0xBE7B, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF7D, 0x0000, 0x0000, // 0x0030 (48) pixels + 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x74D7, 0x74D8, 0x8D7A, 0x95BB, 0x95BB, 0x95BB, 0x95BB, 0x95BB, 0x95BB, 0x9DBB, 0x9DBB, // 0x0040 (64) pixels + 0x8D9A, 0x7518, 0x7CF8, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0xFFFF, 0x0012, 0xFFFF, 0x5415, 0x6497, 0x8D7A, 0x8D7B, // 0x0050 (80) pixels + 0x855A, 0x855A, 0x855A, 0x855A, 0x855A, 0x855A, 0x855A, 0x855A, 0x8D7B, 0x8D9A, 0x6CB8, 0x5C36, 0xFFFF, 0x0355, 0xFFFF, 0x0000, // 0x0060 (96) pixels + 0x0000, 0x6C75, 0xE79F, 0x3353, 0x5436, 0x855A, 0x7D3A, 0x7D1A, 0x7D1A, 0x7D1A, 0x7D3A, 0x959B, 0x959B, 0x7D3A, 0x7D1A, 0x7D1A, // 0x0070 (112) pixels + 0x7D1A, 0x7D3A, 0x855A, 0x5C57, 0x3B74, 0xF7DF, 0x7496, 0x0000, 0x2A50, 0x0292, 0x0230, 0x3B74, 0x74F9, 0x751A, 0x74F9, 0x74F9, // 0x0080 (128) pixels + 0x74F9, 0x74F9, 0xAE1B, 0xEF9E, 0xEF9E, 0xAE1B, 0x74F9, 0x74F9, 0x74F9, 0x74F9, 0x751A, 0x7D19, 0x43D5, 0x0251, 0x02B3, 0x3290, // 0x0090 (144) pixels + 0x01EF, 0x002C, 0x0A91, 0x5C77, 0x6CD9, 0x6CD9, 0x6CD9, 0x6CD9, 0x6CD9, 0x6CD9, 0xD6FD, 0xFFFF, 0xFFFF, 0xD6FD, 0x6CD9, 0x6CD9, // 0x00A0 (160) pixels + 0x6CD9, 0x6CD9, 0x6CD9, 0x6CF9, 0x6CB8, 0x1AD2, 0x000C, 0x0230, 0x00CC, 0x01AE, 0x3B74, 0x6498, 0x6498, 0x6498, 0x6498, 0x6498, // 0x00B0 (176) pixels + 0x6498, 0x6498, 0xADFB, 0xF7DF, 0xF7DF, 0xA5FB, 0x6498, 0x6498, 0x6498, 0x6498, 0x6498, 0x6498, 0x64B8, 0x43B5, 0x01CF, 0x00CC, // 0x00C0 (192) pixels + 0x016D, 0x0230, 0x4BD6, 0x5C78, 0x5C78, 0x5C78, 0x5C78, 0x5C78, 0x5C78, 0x5C58, 0x5C78, 0x8539, 0x8539, 0x5C78, 0x5C78, 0x5C78, // 0x00D0 (208) pixels + 0x5C78, 0x5C78, 0x5C78, 0x5C78, 0x5C78, 0x5416, 0x1271, 0x014D, 0x018D, 0x1A91, 0x4BF6, 0x5457, 0x5457, 0x5457, 0x5457, 0x5437, // 0x00E0 (224) pixels + 0x6498, 0xA5DB, 0xA5DB, 0x9DBA, 0x9DBA, 0x8539, 0x5437, 0x5457, 0x5457, 0x5457, 0x5457, 0x5457, 0x5457, 0x5417, 0x22D2, 0x018E, // 0x00F0 (240) pixels + 0x018D, 0x22B1, 0x43F6, 0x4C17, 0x4C17, 0x4C17, 0x4C17, 0x4C17, 0x74D8, 0xE77E, 0xF7DF, 0xFFDF, 0xF7DF, 0xC69C, 0x4417, 0x4C17, // 0x0100 (256) pixels + 0x4C17, 0x4C17, 0x4C17, 0x4C17, 0x4C17, 0x4C17, 0x2AF2, 0x01AE, 0x018D, 0x22B1, 0x43D6, 0x43F7, 0x43F7, 0x43F7, 0x43F7, 0x43F7, // 0x0110 (272) pixels + 0x4C17, 0x6CD9, 0xCEDD, 0xFFFF, 0xFFFF, 0xC69C, 0x3BF7, 0x4417, 0x43F7, 0x43F7, 0x43F7, 0x43F7, 0x4C17, 0x4BF7, 0x22D2, 0x01AE, // 0x0120 (288) pixels + 0x01AD, 0x1A91, 0x3BB6, 0x3BD6, 0x3BB6, 0x3BD6, 0x3BD7, 0x3BF7, 0x3BF7, 0x2BD7, 0xBE7C, 0xFFFF, 0xFFFF, 0xBE7C, 0x2BD7, 0x3BF8, // 0x0130 (304) pixels + 0x43F7, 0x43F7, 0x43D7, 0x3BB6, 0x2B55, 0x12D3, 0x0210, 0x01AD, 0x018D, 0x0A50, 0x2314, 0x2B55, 0x2B55, 0x2B96, 0x33B7, 0x33B7, // 0x0140 (320) pixels + 0x33D8, 0x23D7, 0xBE7C, 0xFFDF, 0xFFDF, 0xBE5C, 0x1BB7, 0x33D8, 0x2B97, 0x1B56, 0x0AF5, 0x0293, 0x0253, 0x0252, 0x0210, 0x01AD, // 0x0150 (336) pixels + 0x018D, 0x01EF, 0x0252, 0x0273, 0x02B4, 0x02D5, 0x0AF5, 0x0B16, 0x1337, 0x0337, 0xAE1B, 0xF79E, 0xEF9E, 0xADFA, 0x02F7, 0x0317, // 0x0160 (352) pixels + 0x02F6, 0x02D5, 0x02B5, 0x0294, 0x0273, 0x0252, 0x01EF, 0x018D, 0x016D, 0x01EF, 0x0252, 0x0273, 0x02B4, 0x02D5, 0x02D6, 0x02F7, // 0x0170 (368) pixels + 0x0317, 0x0317, 0xADFA, 0xEF7D, 0xEF7D, 0xADFA, 0x0317, 0x0337, 0x0317, 0x02F6, 0x02D5, 0x02B4, 0x0294, 0x0272, 0x01EF, 0x016D, // 0x0180 (384) pixels + 0x016C, 0x01AD, 0x0251, 0x0294, 0x02B5, 0x02D5, 0x02F6, 0x0317, 0x0338, 0x0318, 0xADFB, 0xEF7D, 0xEF7D, 0xADFA, 0x0318, 0x0338, // 0x0190 (400) pixels + 0x0337, 0x0317, 0x02F6, 0x02D5, 0x02B4, 0x0252, 0x01AE, 0x014C, 0x01EE, 0x014C, 0x01EF, 0x0294, 0x02D5, 0x02F6, 0x0317, 0x0338, // 0x01A0 (416) pixels + 0x2398, 0x7CF9, 0xC69C, 0xF79D, 0xF79D, 0xC69C, 0x7CF9, 0x2398, 0x0338, 0x0317, 0x02F6, 0x02D6, 0x02B4, 0x01EF, 0x014C, 0x01CE, // 0x01B0 (432) pixels + 0x016C, 0x0251, 0x018D, 0x0231, 0x02D5, 0x02F6, 0x0317, 0x0338, 0x4418, 0xCEFC, 0xDF3D, 0xDF3D, 0xDF3D, 0xDF3D, 0xCEFC, 0x4418, // 0x01C0 (448) pixels + 0x0358, 0x0337, 0x0317, 0x02D6, 0x0231, 0x018D, 0x02B2, 0x016C, 0x00A4, 0x016D, 0x0000, 0x01AD, 0x0251, 0x02F6, 0x0338, 0x0358, // 0x01D0 (464) pixels + 0x1379, 0x445A, 0x4C7A, 0x4C7B, 0x4C9B, 0x4C7A, 0x445A, 0x1399, 0x0359, 0x0338, 0x0317, 0x0251, 0x01AD, 0x0006, 0x016D, 0x0060, // 0x01E0 (480) pixels + 0x0000, 0x012C, 0x012C, 0x0009, 0x01AD, 0x0231, 0x02F6, 0x0358, 0x0379, 0x039A, 0x03BB, 0x03DC, 0x03DC, 0x03BC, 0x039B, 0x037A, // 0x01F0 (496) pixels + 0x0379, 0x0317, 0x0251, 0x01AD, 0x000B, 0x012C, 0x012C, 0x0000, 0x0000, 0x0000, 0x016C, 0x012C, 0x0003, 0x018D, 0x0210, 0x02B4, // 0x0200 (512) pixels + 0x0337, 0x0379, 0x039A, 0x03BB, 0x03DB, 0x03BB, 0x0379, 0x0337, 0x02B4, 0x0210, 0x018D, 0x0005, 0x012C, 0x016D, 0x0000, 0x0000, // 0x0210 (528) pixels + 0x0000, 0x0000, 0x0000, 0x014C, 0x016D, 0x0335, 0x014C, 0x01AE, 0x0210, 0x0272, 0x02B4, 0x02B4, 0x02D4, 0x02B4, 0x0272, 0x0210, // 0x0220 (544) pixels + 0x01AE, 0x014B, 0x0315, 0x016D, 0x014C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00C6, 0x014C, 0x01EE, 0x016C, // 0x0230 (560) pixels + 0x01AD, 0x01CE, 0x01EE, 0x01CE, 0x01CE, 0x01EE, 0x01CE, 0x01AD, 0x016C, 0x01EE, 0x016C, 0x00A5, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0240 (576) pixels +}}; +} +} diff --git a/src/icons/lock.h b/src/icons/lock.h new file mode 100644 index 0000000..182323b --- /dev/null +++ b/src/icons/lock.h @@ -0,0 +1,46 @@ +#pragma once + +#include "icon.h" + +namespace { +namespace icons { +const Icon<24, 24> lock{{ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xB5B6, 0xAD55, 0xAD75, 0xBDD7, 0xBDF7, 0x9CF3, 0x8430, 0xAD75, // 0x0010 (16) pixels + 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xBDF7, 0xFFFF, // 0x0020 (32) pixels + 0xBDD7, 0xBDF7, 0xC618, 0xBDD7, 0xBDD7, 0xC638, 0xC618, 0xAD75, 0xFFFF, 0xC618, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0030 (48) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xA514, 0xBDF7, 0xBDF7, 0xBDF7, 0xB5B6, 0xB596, 0xAD75, 0xAD75, 0xB596, 0xAD75, 0xC618, // 0x0040 (64) pixels + 0xBDF7, 0xAD75, 0x94B2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4A49, 0xBDF7, 0xBDF7, // 0x0050 (80) pixels + 0xAD75, 0xAD55, 0xA534, 0xA534, 0x9CF3, 0x9CD3, 0x9CF3, 0xA514, 0xC618, 0xCE59, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0060 (96) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xAD55, 0xBDD7, 0xB596, 0xA534, 0xAD55, 0x52AA, 0xAD55, 0xAD55, 0x7BCF, 0x9492, 0x9CD3, // 0x0070 (112) pixels + 0xB596, 0xCE59, 0xBDF7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xAD75, 0xB5B6, 0xAD55, // 0x0080 (128) pixels + 0x9CF3, 0xB5B6, 0xFFFF, 0x0000, 0x0000, 0xFFFF, 0x94B2, 0x9492, 0xAD55, 0xC638, 0xC638, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0090 (144) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xBDD7, 0xB5B6, 0xA514, 0x9492, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xDEFB, 0x8C71, // 0x00A0 (160) pixels + 0xA514, 0xC618, 0xCE79, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xBDD7, 0xB5B6, 0x9CF3, // 0x00B0 (176) pixels + 0x8C71, 0xD6BA, 0x0000, 0x0000, 0x0000, 0x0000, 0x8410, 0x94B2, 0x9CF3, 0xBDF7, 0xD69A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x00C0 (192) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xBDD7, 0xB5B6, 0xA514, 0x9CD3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xA514, // 0x00D0 (208) pixels + 0xA514, 0xBDF7, 0xD6BA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xDE0B, 0xA59C, 0xB5B7, 0xAD55, // 0x00E0 (224) pixels + 0xA555, 0xAC4A, 0xA3E8, 0x9387, 0x9366, 0x9BC7, 0xA409, 0xAD97, 0xA535, 0xBDF8, 0xCEBF, 0xC5AC, 0x0000, 0x0000, 0x0000, 0x0000, // 0x00F0 (240) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0xDE0B, 0xE66C, 0xCDB1, 0xBD50, 0xB4CD, 0xAC4A, 0xA3E8, 0x9387, 0x9366, 0x9BC7, 0xA409, 0xB4CD, // 0x0100 (256) pixels + 0xB530, 0xCDF2, 0xE690, 0xC5AC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xDE0B, 0xF6AA, 0xEE45, 0xE5A3, // 0x0110 (272) pixels + 0xD543, 0xC4C3, 0xBC63, 0xB423, 0xB443, 0xC483, 0xCCC3, 0xD543, 0xE603, 0xF6E9, 0xEF10, 0xC5AC, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0120 (288) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0xDE0B, 0xF6C9, 0xF663, 0xEDE0, 0xE560, 0xD4E0, 0xCCA0, 0xCCA0, 0xCCC0, 0xD4E0, 0xDD20, 0xE5A0, // 0x0130 (304) pixels + 0xF660, 0xFF48, 0xEF30, 0xC5AC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xDE0B, 0xF6C9, 0xF683, 0xEDE0, // 0x0140 (320) pixels + 0xE580, 0xD500, 0xCCC0, 0xCCA0, 0xD4C0, 0xD500, 0xDD20, 0xEDA0, 0xF660, 0xFF48, 0xEF30, 0xC5AC, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0150 (336) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0xDE0B, 0xF6C9, 0xF683, 0xEDE0, 0xE580, 0xD500, 0xCCC0, 0xCCA0, 0xD4C0, 0xD500, 0xDD20, 0xE5A0, // 0x0160 (352) pixels + 0xF660, 0xFF48, 0xEF30, 0xC5AC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xDE0B, 0xF6C9, 0xF683, 0xEDE0, // 0x0170 (368) pixels + 0xE580, 0xD500, 0xCCA0, 0xCCA0, 0xD4E0, 0xD500, 0xDD20, 0xEDC0, 0xF660, 0xFF48, 0xEF30, 0xC5AC, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0180 (384) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0xDE0B, 0xF6C9, 0xF663, 0xEDE0, 0xE580, 0xD500, 0xCCC0, 0xCCC0, 0xD4E0, 0xDD00, 0xDD40, 0xE5A0, // 0x0190 (400) pixels + 0xF660, 0xFF48, 0xEF30, 0xC5AC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xDE0B, 0xF6C9, 0xF683, 0xF600, // 0x01A0 (416) pixels + 0xE580, 0xD500, 0xCCC0, 0xCCC0, 0xD4E0, 0xDD00, 0xE540, 0xEDC0, 0xF660, 0xFF48, 0xEF30, 0xC5AC, 0x0000, 0x0000, 0x0000, 0x0000, // 0x01B0 (432) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0xDE0B, 0xF6C9, 0xF683, 0xF600, 0xE580, 0xD500, 0xCCA0, 0xCCA0, 0xD4E0, 0xDD00, 0xDD40, 0xEDC0, // 0x01C0 (448) pixels + 0xF660, 0xFF48, 0xEF30, 0xC5AC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xDE0B, 0xF6C9, 0xF683, 0xF5E0, // 0x01D0 (464) pixels + 0xE580, 0xD500, 0xCCC0, 0xCCC0, 0xD4E0, 0xDD00, 0xDD40, 0xEDC0, 0xF660, 0xFF48, 0xEF30, 0xC5AC, 0x0000, 0x0000, 0x0000, 0x0000, // 0x01E0 (480) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0xDE0B, 0xF6C9, 0xF683, 0xF600, 0xE580, 0xD520, 0xCCC0, 0xCCC0, 0xD500, 0xDD20, 0xE540, 0xEDC0, // 0x01F0 (496) pixels + 0xF680, 0xFF48, 0xEF30, 0xC5AC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xDE0B, 0xF6C9, 0xF683, 0xF600, // 0x0200 (512) pixels + 0xE580, 0xD520, 0xCCE0, 0xCCE0, 0xD500, 0xDD20, 0xE540, 0xEDC0, 0xFE80, 0xFF68, 0xEF30, 0xCDAC, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0210 (528) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0xC569, 0xE648, 0xE5E2, 0xD540, 0xC4E0, 0xBC60, 0xB420, 0xB420, 0xB440, 0xBC60, 0xC480, 0xCD00, // 0x0220 (544) pixels + 0xDDA0, 0xE687, 0xDE8F, 0xACEB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0230 (560) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0240 (576) pixels +}}; +} +} diff --git a/src/icons/logo.h b/src/icons/logo.h new file mode 100644 index 0000000..31d0de2 --- /dev/null +++ b/src/icons/logo.h @@ -0,0 +1,1960 @@ +#pragma once + +#include "icon.h" + +namespace { +namespace icons { +const Icon<240, 130> logo{{ + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0010 (16) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0020 (32) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0030 (48) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0040 (64) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0050 (80) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0060 (96) pixels + 0xFFFF, 0xF7BE, 0x8C51, 0x2104, 0x4208, 0xCE59, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0070 (112) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0080 (128) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0090 (144) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x00A0 (160) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x00B0 (176) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x00C0 (192) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x00D0 (208) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x00E0 (224) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x00F0 (240) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0100 (256) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0110 (272) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0120 (288) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0130 (304) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0140 (320) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0150 (336) pixels + 0xFFFF, 0xEF7D, 0x52AA, 0x0000, 0x0000, 0x73AE, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0160 (352) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0170 (368) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0180 (384) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0190 (400) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x01A0 (416) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x01B0 (432) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x01C0 (448) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x01D0 (464) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x01E0 (480) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x01F0 (496) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0200 (512) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0210 (528) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0220 (544) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0230 (560) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0240 (576) pixels + 0xFFFF, 0xFFDF, 0xA514, 0x0020, 0x0000, 0x39E7, 0xEF5D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0250 (592) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0260 (608) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0270 (624) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0280 (640) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0290 (656) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x02A0 (672) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x02B0 (688) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x02C0 (704) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x02D0 (720) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x02E0 (736) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x02F0 (752) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0300 (768) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0310 (784) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0320 (800) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0330 (816) pixels + 0xFFFF, 0xFFFF, 0xE73C, 0x31A6, 0x0000, 0x1082, 0xCE59, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0340 (832) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0350 (848) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0360 (864) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0370 (880) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0380 (896) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0390 (912) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x03A0 (928) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x03B0 (944) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x03C0 (960) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x03D0 (976) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x03E0 (992) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x03F0 (1008) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0400 (1024) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0410 (1040) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0420 (1056) pixels + 0xFFFF, 0xFFFF, 0xFFDF, 0x738E, 0x0000, 0x0000, 0x9CD3, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0430 (1072) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0440 (1088) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0450 (1104) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0460 (1120) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0470 (1136) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0480 (1152) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0490 (1168) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x04A0 (1184) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x04B0 (1200) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x04C0 (1216) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x04D0 (1232) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x04E0 (1248) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x04F0 (1264) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0500 (1280) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xEF5D, 0xD6BA, 0xCE79, 0xCE79, 0xBDD7, 0xA514, // 0x0510 (1296) pixels + 0xA534, 0xB596, 0xC618, 0x8430, 0x0000, 0x0000, 0x738E, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0520 (1312) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0530 (1328) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0540 (1344) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0550 (1360) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0560 (1376) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0570 (1392) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0580 (1408) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0590 (1424) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x05A0 (1440) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x05B0 (1456) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x05C0 (1472) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x05D0 (1488) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x05E0 (1504) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x05F0 (1520) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF7D, 0xC638, 0x9CD3, 0x6B4D, 0x39E7, 0x18E3, 0x1082, 0x0861, 0x0020, 0x0000, // 0x0600 (1536) pixels + 0x0000, 0x0000, 0x0841, 0x18E3, 0x0000, 0x0000, 0x52AA, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0610 (1552) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0620 (1568) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0630 (1584) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0640 (1600) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0650 (1616) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0660 (1632) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0670 (1648) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0680 (1664) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0690 (1680) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x06A0 (1696) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x06B0 (1712) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x06C0 (1728) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x06D0 (1744) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x06E0 (1760) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7BE, 0xB596, 0x528A, 0x1082, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x06F0 (1776) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4208, 0xEF7D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0700 (1792) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0710 (1808) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0720 (1824) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0730 (1840) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0740 (1856) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0750 (1872) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0760 (1888) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0770 (1904) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0780 (1920) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0790 (1936) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x07A0 (1952) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x07B0 (1968) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x07C0 (1984) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x07D0 (2000) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xF7BE, 0x8C71, 0x10A2, 0x0000, 0x0000, 0x0000, 0x0000, 0x1082, 0x2965, 0x4208, 0x4228, 0x5ACB, 0x73AE, // 0x07E0 (2016) pixels + 0x7BCF, 0x6B4D, 0x5ACB, 0x632C, 0x10A2, 0x0000, 0x2965, 0xE73C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x07F0 (2032) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0800 (2048) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0810 (2064) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0820 (2080) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0830 (2096) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0840 (2112) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0850 (2128) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0860 (2144) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0870 (2160) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0880 (2176) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0890 (2192) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x08A0 (2208) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x08B0 (2224) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x08C0 (2240) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xB596, 0x10A2, 0x0000, 0x0000, 0x31A6, 0x7BCF, 0xAD55, 0xCE59, 0xE73C, 0xEF7D, 0xF79E, 0xF7BE, 0xFFFF, // 0x08D0 (2256) pixels + 0xFFFF, 0xFFDF, 0xF7BE, 0xDEFB, 0x2965, 0x0000, 0x18E3, 0xDEDB, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x08E0 (2272) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x08F0 (2288) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0900 (2304) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0910 (2320) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0920 (2336) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0930 (2352) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0940 (2368) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0950 (2384) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0960 (2400) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0970 (2416) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0980 (2432) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0990 (2448) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x09A0 (2464) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x09B0 (2480) pixels + 0xFFFF, 0xFFFF, 0xEF7D, 0x52AA, 0x0000, 0x0000, 0x73AE, 0xDEFB, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x09C0 (2496) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xEF7D, 0x4228, 0x0000, 0x0861, 0xCE59, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x09D0 (2512) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x09E0 (2528) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x09F0 (2544) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0A00 (2560) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0A10 (2576) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0A20 (2592) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0A30 (2608) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0A40 (2624) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0A50 (2640) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0A60 (2656) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0A70 (2672) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0A80 (2688) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0A90 (2704) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0AA0 (2720) pixels + 0xFFFF, 0xFFFF, 0xBDD7, 0x0861, 0x0000, 0x31A6, 0xDEFB, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7BE, 0xCE79, 0xD6BA, // 0x0AB0 (2736) pixels + 0xFFDF, 0xFFFF, 0xFFFF, 0xFFDF, 0x6B4D, 0x0000, 0x0000, 0xAD55, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0AC0 (2752) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0AD0 (2768) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0AE0 (2784) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0AF0 (2800) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0B00 (2816) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0B10 (2832) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0B20 (2848) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0B30 (2864) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0B40 (2880) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0B50 (2896) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0B60 (2912) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0B70 (2928) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0B80 (2944) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0B90 (2960) pixels + 0xFFFF, 0xF7BE, 0x6B4D, 0x0000, 0x0000, 0x8C51, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xAD75, 0x2124, 0x31A6, // 0x0BA0 (2976) pixels + 0xCE59, 0xFFFF, 0xFFFF, 0xFFFF, 0x9CD3, 0x0000, 0x0000, 0x738E, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0BB0 (2992) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0BC0 (3008) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0BD0 (3024) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0BE0 (3040) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0BF0 (3056) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0C00 (3072) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0C10 (3088) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0C20 (3104) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0C30 (3120) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0C40 (3136) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0C50 (3152) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0C60 (3168) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0C70 (3184) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0C80 (3200) pixels + 0xFFFF, 0xDEDB, 0x2124, 0x0000, 0x18E3, 0xD69A, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x9492, 0x0000, 0x0861, // 0x0C90 (3216) pixels + 0xB5B6, 0xFFFF, 0xFFFF, 0xFFFF, 0xCE59, 0x1082, 0x0000, 0x39C7, 0xE73C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0CA0 (3232) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0CB0 (3248) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0CC0 (3264) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0CD0 (3280) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0CE0 (3296) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0CF0 (3312) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0D00 (3328) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0D10 (3344) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0D20 (3360) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0D30 (3376) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0D40 (3392) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0D50 (3408) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0D60 (3424) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0D70 (3440) pixels + 0xFFFF, 0xA514, 0x0000, 0x0000, 0x5AEB, 0xF7BE, 0xFFFF, 0xFFFF, 0xEF7D, 0xEF7D, 0xFFFF, 0xFFFF, 0xFFFF, 0xDEFB, 0x8430, 0x9492, // 0x0D80 (3456) pixels + 0xEF5D, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF5D, 0x4208, 0x0000, 0x0841, 0xB5B6, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0D90 (3472) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0DA0 (3488) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0DB0 (3504) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0DC0 (3520) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0DD0 (3536) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0DE0 (3552) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0DF0 (3568) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0E00 (3584) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0E10 (3600) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0E20 (3616) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0E30 (3632) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0E40 (3648) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0E50 (3664) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0E60 (3680) pixels + 0xF7BE, 0x5AEB, 0x0000, 0x0000, 0xA514, 0xFFFF, 0xFFFF, 0xE71C, 0x73AE, 0x6B4D, 0xD6BA, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, // 0x0E70 (3696) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0x8C51, 0x0000, 0x0000, 0x630C, 0xF79E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0E80 (3712) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0E90 (3728) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0EA0 (3744) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0EB0 (3760) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0EC0 (3776) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0ED0 (3792) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0EE0 (3808) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0EF0 (3824) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0F00 (3840) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0F10 (3856) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0F20 (3872) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0F30 (3888) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0F40 (3904) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0F50 (3920) pixels + 0xE73C, 0x2965, 0x0000, 0x10A2, 0xD69A, 0xFFFF, 0xFFFF, 0xAD75, 0x0841, 0x0000, 0x94B2, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0F60 (3936) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xD6BA, 0x2104, 0x0000, 0x2104, 0xDEDB, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0F70 (3952) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0F80 (3968) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0F90 (3984) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0FA0 (4000) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0FB0 (4016) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0FC0 (4032) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0FD0 (4048) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0FE0 (4064) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0FF0 (4080) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1000 (4096) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1010 (4112) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1020 (4128) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1030 (4144) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1040 (4160) pixels + 0xC618, 0x0841, 0x0000, 0x39C7, 0xEF5D, 0xFFFF, 0xFFFF, 0xA514, 0x0000, 0x0000, 0x5ACB, 0xEF5D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1050 (4176) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xF79E, 0xDEDB, 0xA534, 0x18E3, 0x0000, 0x0841, 0xC638, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1060 (4192) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1070 (4208) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1080 (4224) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1090 (4240) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x10A0 (4256) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x10B0 (4272) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x10C0 (4288) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x10D0 (4304) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x10E0 (4320) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x10F0 (4336) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1100 (4352) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1110 (4368) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1120 (4384) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1130 (4400) pixels + 0x8C71, 0x0000, 0x0000, 0x7BEF, 0xFFDF, 0xFFFF, 0xFFFF, 0xBDD7, 0x0861, 0x0000, 0x0020, 0x6B6D, 0xBDD7, 0xCE79, 0xE71C, 0xEF7D, // 0x1140 (4416) pixels + 0xE73C, 0xBDD7, 0x8430, 0x4A69, 0x2104, 0x0000, 0x0000, 0x0000, 0x10A2, 0xCE59, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1150 (4432) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1160 (4448) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1170 (4464) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1180 (4480) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1190 (4496) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x11A0 (4512) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x11B0 (4528) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x11C0 (4544) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x11D0 (4560) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x11E0 (4576) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x11F0 (4592) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1200 (4608) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1210 (4624) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7BE, // 0x1220 (4640) pixels + 0x630C, 0x0000, 0x0000, 0xB596, 0xFFFF, 0xFFFF, 0xFFFF, 0xF79E, 0x7BEF, 0x0861, 0x0000, 0x0000, 0x0020, 0x1082, 0x2945, 0x39E7, // 0x1230 (4656) pixels + 0x2124, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x18C3, 0x7BEF, 0xF79E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1240 (4672) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1250 (4688) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1260 (4704) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1270 (4720) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1280 (4736) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1290 (4752) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x12A0 (4768) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x12B0 (4784) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x12C0 (4800) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x12D0 (4816) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x12E0 (4832) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x12F0 (4848) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1300 (4864) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7BE, // 0x1310 (4880) pixels + 0x52AA, 0x0000, 0x0020, 0xC618, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF7D, 0x8C71, 0x10A2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x1320 (4896) pixels + 0x0000, 0x0000, 0x0000, 0x0020, 0x2945, 0x5ACB, 0x94B2, 0xCE79, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1330 (4912) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1340 (4928) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1350 (4944) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1360 (4960) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1370 (4976) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1380 (4992) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1390 (5008) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x13A0 (5024) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x13B0 (5040) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x13C0 (5056) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x13D0 (5072) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x13E0 (5088) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x13F0 (5104) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, // 0x1400 (5120) pixels + 0x6B6D, 0x0000, 0x0000, 0xAD55, 0xFFDF, 0xEF7D, 0xDEDB, 0xB5B6, 0x8430, 0x4A49, 0x0861, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x1410 (5136) pixels + 0x0000, 0x0000, 0x39E7, 0xAD55, 0xDEFB, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1420 (5152) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1430 (5168) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1440 (5184) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1450 (5200) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1460 (5216) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1470 (5232) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1480 (5248) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1490 (5264) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x14A0 (5280) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x14B0 (5296) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x14C0 (5312) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x14D0 (5328) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x14E0 (5344) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x14F0 (5360) pixels + 0x8C51, 0x0000, 0x0000, 0x5ACB, 0x73AE, 0x4A49, 0x2104, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0841, 0x4208, // 0x1500 (5376) pixels + 0x8C71, 0xBDD7, 0xE73C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1510 (5392) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1520 (5408) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1530 (5424) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1540 (5440) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1550 (5456) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1560 (5472) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1570 (5488) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1580 (5504) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1590 (5520) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x15A0 (5536) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x15B0 (5552) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x15C0 (5568) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x15D0 (5584) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x15E0 (5600) pixels + 0xA514, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x2945, 0x4A69, 0x6B4D, 0x5ACB, 0x2104, 0x5ACB, // 0x15F0 (5616) pixels + 0xDEFB, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1600 (5632) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1610 (5648) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1620 (5664) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1630 (5680) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1640 (5696) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1650 (5712) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1660 (5728) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1670 (5744) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1680 (5760) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1690 (5776) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x16A0 (5792) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x16B0 (5808) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x16C0 (5824) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x16D0 (5840) pixels + 0xCE59, 0x18E3, 0x0000, 0x0000, 0x0000, 0x0841, 0x2945, 0x52AA, 0x8C71, 0xBDD7, 0xDEFB, 0xF79E, 0xF79E, 0x738E, 0x0000, 0x0841, // 0x16E0 (5856) pixels + 0xB5B6, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x16F0 (5872) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1700 (5888) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1710 (5904) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1720 (5920) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1730 (5936) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1740 (5952) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1750 (5968) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1760 (5984) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1770 (6000) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1780 (6016) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1790 (6032) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x17A0 (6048) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x17B0 (6064) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x17C0 (6080) pixels + 0xF7BE, 0xA514, 0x5ACB, 0x6B6D, 0x9CF3, 0xC638, 0xE71C, 0xF79E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF5D, 0x39E7, 0x0000, 0x0861, // 0x17D0 (6096) pixels + 0xCE59, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x17E0 (6112) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x17F0 (6128) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1800 (6144) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1810 (6160) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1820 (6176) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1830 (6192) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1840 (6208) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1850 (6224) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1860 (6240) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1870 (6256) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1880 (6272) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1890 (6288) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x18A0 (6304) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x18B0 (6320) pixels + 0xFFFF, 0xFFFF, 0xF7BE, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xDEFB, 0x2104, 0x0000, 0x2945, // 0x18C0 (6336) pixels + 0xE71C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x18D0 (6352) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x18E0 (6368) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x18F0 (6384) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1900 (6400) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1910 (6416) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1920 (6432) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1930 (6448) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1940 (6464) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1950 (6480) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1960 (6496) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1970 (6512) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1980 (6528) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1990 (6544) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x19A0 (6560) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xCE79, 0x1082, 0x0000, 0x4208, // 0x19B0 (6576) pixels + 0xEF7D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x19C0 (6592) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x19D0 (6608) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x19E0 (6624) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x19F0 (6640) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1A00 (6656) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1A10 (6672) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1A20 (6688) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1A30 (6704) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1A40 (6720) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1A50 (6736) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1A60 (6752) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1A70 (6768) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1A80 (6784) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1A90 (6800) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xBDD7, 0x0020, 0x0000, 0x5AEB, // 0x1AA0 (6816) pixels + 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1AB0 (6832) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1AC0 (6848) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1AD0 (6864) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1AE0 (6880) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1AF0 (6896) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1B00 (6912) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1B10 (6928) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1B20 (6944) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1B30 (6960) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1B40 (6976) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1B50 (6992) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1B60 (7008) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1B70 (7024) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1B80 (7040) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xA514, 0x0000, 0x0000, 0x7BCF, // 0x1B90 (7056) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1BA0 (7072) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1BB0 (7088) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1BC0 (7104) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1BD0 (7120) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1BE0 (7136) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1BF0 (7152) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1C00 (7168) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1C10 (7184) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1C20 (7200) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1C30 (7216) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1C40 (7232) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1C50 (7248) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1C60 (7264) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1C70 (7280) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x9CD3, 0x0000, 0x0000, 0x7BEF, // 0x1C80 (7296) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1C90 (7312) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1CA0 (7328) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1CB0 (7344) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1CC0 (7360) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1CD0 (7376) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1CE0 (7392) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1CF0 (7408) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1D00 (7424) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1D10 (7440) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1D20 (7456) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1D30 (7472) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1D40 (7488) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1D50 (7504) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1D60 (7520) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xE73C, 0xC638, 0xB596, 0x9CF3, 0x8410, 0x4228, 0x0000, 0x0000, 0x4A49, // 0x1D70 (7536) pixels + 0xEF5D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1D80 (7552) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1D90 (7568) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1DA0 (7584) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1DB0 (7600) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1DC0 (7616) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1DD0 (7632) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1DE0 (7648) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1DF0 (7664) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1E00 (7680) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1E10 (7696) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1E20 (7712) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1E30 (7728) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1E40 (7744) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1E50 (7760) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xE73C, 0xA514, 0x4228, 0x0861, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2945, // 0x1E60 (7776) pixels + 0xDEDB, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1E70 (7792) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1E80 (7808) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1E90 (7824) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1EA0 (7840) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1EB0 (7856) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1EC0 (7872) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1ED0 (7888) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1EE0 (7904) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1EF0 (7920) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1F00 (7936) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1F10 (7952) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1F20 (7968) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1F30 (7984) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1F40 (8000) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xF79E, 0xA514, 0x39E7, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7BCF, // 0x1F50 (8016) pixels + 0xEF7D, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1F60 (8032) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1F70 (8048) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1F80 (8064) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1F90 (8080) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1FA0 (8096) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1FB0 (8112) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1FC0 (8128) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1FD0 (8144) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1FE0 (8160) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1FF0 (8176) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2000 (8192) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2010 (8208) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2020 (8224) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2030 (8240) pixels + 0xFFFF, 0xFFFF, 0xEF7D, 0x8430, 0x0861, 0x0000, 0x0000, 0x0020, 0x39C7, 0x630C, 0x7BCF, 0x94B2, 0x4A49, 0x0000, 0x0000, 0x94B2, // 0x2040 (8256) pixels + 0xA534, 0x738E, 0x9CF3, 0xE73C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2050 (8272) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2060 (8288) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2070 (8304) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2080 (8320) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2090 (8336) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x20A0 (8352) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x20B0 (8368) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x20C0 (8384) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x20D0 (8400) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x20E0 (8416) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x20F0 (8432) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2100 (8448) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2110 (8464) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2120 (8480) pixels + 0xFFFF, 0xF79E, 0x8430, 0x0861, 0x0000, 0x0020, 0x4A49, 0xA514, 0xE73C, 0xFFDF, 0xFFDF, 0xFFFF, 0x94B2, 0x0000, 0x0000, 0x6B4D, // 0x2130 (8496) pixels + 0x39E7, 0x0000, 0x0020, 0x5AEB, 0xD69A, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2140 (8512) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2150 (8528) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2160 (8544) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2170 (8560) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2180 (8576) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2190 (8592) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x21A0 (8608) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x21B0 (8624) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x21C0 (8640) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x21D0 (8656) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x21E0 (8672) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x21F0 (8688) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2200 (8704) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2210 (8720) pixels + 0xFFFF, 0xB596, 0x1082, 0x0000, 0x18C3, 0x94B2, 0xEF5D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xCE59, 0x31A6, 0x2945, 0xA534, // 0x2220 (8736) pixels + 0x7BCF, 0x0861, 0x0000, 0x0000, 0x31A6, 0xAD55, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2230 (8752) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2240 (8768) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2250 (8784) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2260 (8800) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2270 (8816) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2280 (8832) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2290 (8848) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x22A0 (8864) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x22B0 (8880) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x22C0 (8896) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x22D0 (8912) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x22E0 (8928) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x22F0 (8944) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2300 (8960) pixels + 0xF79E, 0x5AEB, 0x0000, 0x0000, 0x8C51, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xCE59, 0xC638, 0xF7BE, // 0x2310 (8976) pixels + 0xEF7D, 0xA534, 0x31A6, 0x0000, 0x0000, 0x1082, 0x6B6D, 0xBDD7, 0xEF5D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2320 (8992) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2330 (9008) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2340 (9024) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2350 (9040) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2360 (9056) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2370 (9072) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2380 (9088) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2390 (9104) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x23A0 (9120) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x23B0 (9136) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x23C0 (9152) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x23D0 (9168) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x23E0 (9184) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x23F0 (9200) pixels + 0xD69A, 0x18E3, 0x0000, 0x18E3, 0xD6BA, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2400 (9216) pixels + 0xFFFF, 0xFFFF, 0xCE79, 0x5AEB, 0x0020, 0x0000, 0x0000, 0x0861, 0x528A, 0xAD75, 0xE71C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2410 (9232) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2420 (9248) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2430 (9264) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2440 (9280) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2450 (9296) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2460 (9312) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2470 (9328) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2480 (9344) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2490 (9360) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x24A0 (9376) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x24B0 (9392) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x24C0 (9408) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x24D0 (9424) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x24E0 (9440) pixels + 0x9492, 0x0000, 0x0000, 0x630C, 0xF79E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x24F0 (9456) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xEF5D, 0x8C71, 0x2124, 0x0000, 0x0000, 0x0000, 0x0020, 0x4208, 0xB5B6, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2500 (9472) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2510 (9488) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2520 (9504) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2530 (9520) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2540 (9536) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2550 (9552) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2560 (9568) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2570 (9584) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2580 (9600) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2590 (9616) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x25A0 (9632) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x25B0 (9648) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x25C0 (9664) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7BE, // 0x25D0 (9680) pixels + 0x5AEB, 0x0000, 0x0000, 0xAD75, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x25E0 (9696) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xCE79, 0x8C51, 0x39C7, 0x0000, 0x0000, 0x0000, 0x18C3, 0x7BEF, 0xDEFB, 0xFFFF, 0xFFFF, // 0x25F0 (9712) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2600 (9728) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2610 (9744) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2620 (9760) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2630 (9776) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2640 (9792) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2650 (9808) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2660 (9824) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2670 (9840) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2680 (9856) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2690 (9872) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x26A0 (9888) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x26B0 (9904) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7BE, // 0x26C0 (9920) pixels + 0x528A, 0x0000, 0x0020, 0xC638, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x26D0 (9936) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xDEFB, 0x8C71, 0x3186, 0x0000, 0x0000, 0x0000, 0x5AEB, 0xE71C, 0xFFFF, // 0x26E0 (9952) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x26F0 (9968) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2700 (9984) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2710 (10000) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2720 (10016) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2730 (10032) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2740 (10048) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2750 (10064) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2760 (10080) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2770 (10096) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2780 (10112) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2790 (10128) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x27A0 (10144) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7BE, // 0x27B0 (10160) pixels + 0x528A, 0x0000, 0x0841, 0xC638, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x27C0 (10176) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xDEDB, 0x7BEF, 0x10A2, 0x0000, 0x0000, 0x7BCF, 0xF79E, // 0x27D0 (10192) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x27E0 (10208) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x27F0 (10224) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2800 (10240) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2810 (10256) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2820 (10272) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2830 (10288) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2840 (10304) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2850 (10320) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2860 (10336) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2870 (10352) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2880 (10368) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2890 (10384) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7BE, // 0x28A0 (10400) pixels + 0x528A, 0x0000, 0x0841, 0xC638, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x28B0 (10416) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7BE, 0xAD55, 0x18E3, 0x0000, 0x10A2, 0xBDD7, // 0x28C0 (10432) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x28D0 (10448) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x28E0 (10464) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x28F0 (10480) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2900 (10496) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2910 (10512) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2920 (10528) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2930 (10544) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2940 (10560) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2950 (10576) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2960 (10592) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2970 (10608) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2980 (10624) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7BE, // 0x2990 (10640) pixels + 0x528A, 0x0000, 0x0841, 0xC638, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x29A0 (10656) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0x8410, 0x0000, 0x0000, 0x7BCF, // 0x29B0 (10672) pixels + 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x29C0 (10688) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x29D0 (10704) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x29E0 (10720) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x29F0 (10736) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2A00 (10752) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2A10 (10768) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2A20 (10784) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2A30 (10800) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2A40 (10816) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2A50 (10832) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2A60 (10848) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2A70 (10864) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7BE, // 0x2A80 (10880) pixels + 0x528A, 0x0000, 0x0841, 0xC638, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2A90 (10896) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xB5B6, 0x0000, 0x0000, 0x630C, // 0x2AA0 (10912) pixels + 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2AB0 (10928) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2AC0 (10944) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2AD0 (10960) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2AE0 (10976) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2AF0 (10992) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2B00 (11008) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2B10 (11024) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2B20 (11040) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2B30 (11056) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2B40 (11072) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2B50 (11088) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2B60 (11104) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7BE, // 0x2B70 (11120) pixels + 0x528A, 0x0000, 0x0841, 0xC638, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2B80 (11136) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xBDD7, 0x0020, 0x0000, 0x5AEB, // 0x2B90 (11152) pixels + 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2BA0 (11168) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2BB0 (11184) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2BC0 (11200) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2BD0 (11216) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2BE0 (11232) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2BF0 (11248) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2C00 (11264) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2C10 (11280) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2C20 (11296) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2C30 (11312) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2C40 (11328) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2C50 (11344) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7BE, // 0x2C60 (11360) pixels + 0x528A, 0x0000, 0x0020, 0xC638, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2C70 (11376) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xBDD7, 0x0020, 0x0000, 0x5AEB, // 0x2C80 (11392) pixels + 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2C90 (11408) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2CA0 (11424) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2CB0 (11440) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2CC0 (11456) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2CD0 (11472) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2CE0 (11488) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2CF0 (11504) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2D00 (11520) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7BE, 0xEF5D, 0xF79E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2D10 (11536) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2D20 (11552) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2D30 (11568) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2D40 (11584) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7BE, // 0x2D50 (11600) pixels + 0x5ACB, 0x0000, 0x0020, 0xBDF7, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2D60 (11616) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xBDD7, 0x0020, 0x0000, 0x4A49, // 0x2D70 (11632) pixels + 0xCE79, 0xEF5D, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2D80 (11648) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2D90 (11664) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xF7BE, 0xEF7D, 0xE73C, 0xE73C, 0xE73C, 0xEF5D, 0xF79E, 0xF7BE, // 0x2DA0 (11680) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2DB0 (11696) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2DC0 (11712) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2DD0 (11728) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2DE0 (11744) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2DF0 (11760) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xD6BA, 0xC638, 0xC638, 0xD69A, 0xE73C, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2E00 (11776) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2E10 (11792) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2E20 (11808) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2E30 (11824) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, // 0x2E40 (11840) pixels + 0x73AE, 0x0000, 0x0000, 0xA514, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2E50 (11856) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xBDD7, 0x0020, 0x0000, 0x0000, // 0x2E60 (11872) pixels + 0x18C3, 0x39E7, 0x6B6D, 0x9CF3, 0xC638, 0xDEFB, 0xEF5D, 0xF79E, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2E70 (11888) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2E80 (11904) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xDEFB, 0x9CF3, 0x738E, 0x5AEB, 0x4228, 0x3186, 0x2965, 0x2965, 0x31A6, 0x4A49, 0x5AEB, // 0x2E90 (11920) pixels + 0x8410, 0xAD75, 0xAD75, 0xB596, 0xD6BA, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2EA0 (11936) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2EB0 (11952) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2EC0 (11968) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2ED0 (11984) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2EE0 (12000) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xD69A, 0xC638, 0xC638, 0xC638, 0xC638, 0xCE59, 0xE71C, 0xFFDF, 0xFFFF, // 0x2EF0 (12016) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2F00 (12032) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2F10 (12048) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2F20 (12064) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2F30 (12080) pixels + 0x94B2, 0x0000, 0x0000, 0x8430, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2F40 (12096) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xBDD7, 0x0020, 0x0000, 0x0000, // 0x2F50 (12112) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0841, 0x2104, 0x39C7, 0x4A69, 0x6B4D, 0x8C51, 0xA534, 0xC638, 0xE71C, 0xF7BE, 0xFFFF, 0xFFFF, // 0x2F60 (12128) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2F70 (12144) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xF7BE, 0xAD75, 0x39C7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x2F80 (12160) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x2965, 0x8C51, 0xDEFB, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2F90 (12176) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2FA0 (12192) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2FB0 (12208) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2FC0 (12224) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2FD0 (12240) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF7D, 0xCE79, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, 0xD69A, 0xF79E, // 0x2FE0 (12256) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x2FF0 (12272) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3000 (12288) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3010 (12304) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3020 (12320) pixels + 0xB5B6, 0x0000, 0x0000, 0x5AEB, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3030 (12336) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xBDD7, 0x0020, 0x0000, 0x18C3, // 0x3040 (12352) pixels + 0x2965, 0x1082, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0861, 0x2965, 0x5AEB, 0x7BEF, 0xA534, // 0x3050 (12368) pixels + 0xDEDB, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF7D, // 0x3060 (12384) pixels + 0xEF5D, 0xF79E, 0xF79E, 0x9CD3, 0x10A2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0841, 0x18C3, 0x18E3, 0x0020, 0x0000, 0x0000, 0x0000, // 0x3070 (12400) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x39E7, 0xB5B6, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3080 (12416) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3090 (12432) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x30A0 (12448) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x30B0 (12464) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x30C0 (12480) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xEF5D, 0xD6BA, 0xC638, 0xC638, 0xC638, 0xC638, 0xCE59, // 0x30D0 (12496) pixels + 0xEF5D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x30E0 (12512) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x30F0 (12528) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3100 (12544) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3110 (12560) pixels + 0xD69A, 0x10A2, 0x0000, 0x31A6, 0xEF5D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xE71C, 0x9CF3, 0xAD55, 0xE73C, // 0x3120 (12576) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xB596, 0x0000, 0x0000, 0x632C, // 0x3130 (12592) pixels + 0xDEFB, 0xCE59, 0xA534, 0x73AE, 0x4A49, 0x2945, 0x10A2, 0x0841, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x3140 (12608) pixels + 0x2945, 0x630C, 0x8C51, 0xAD55, 0xC638, 0xDEFB, 0xEF7D, 0xEF7D, 0xEF7D, 0xEF7D, 0xEF7D, 0xEF7D, 0xEF5D, 0xD69A, 0x8C71, 0x4228, // 0x3150 (12624) pixels + 0x31A6, 0x4228, 0x4A69, 0x1082, 0x0000, 0x0000, 0x4208, 0x9CF3, 0xB5B6, 0xC638, 0xDEDB, 0xD69A, 0x4228, 0x0000, 0x0000, 0x0020, // 0x3160 (12640) pixels + 0x18C3, 0x4208, 0x6B4D, 0x52AA, 0x1082, 0x0000, 0x0000, 0x2945, 0xBDF7, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3170 (12656) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3180 (12672) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3190 (12688) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x31A0 (12704) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x31B0 (12720) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF79E, 0xD6BA, 0xC638, 0xC638, 0xC638, // 0x31C0 (12736) pixels + 0xCE59, 0xEF5D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x31D0 (12752) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x31E0 (12768) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x31F0 (12784) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3200 (12800) pixels + 0xE73C, 0x2965, 0x0000, 0x18E3, 0xDEDB, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0x9CD3, 0x0841, 0x0020, 0x4228, // 0x3210 (12816) pixels + 0xA514, 0xD69A, 0xEF7D, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x8430, 0x0000, 0x0000, 0x8C51, // 0x3220 (12832) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xEF7D, 0xE71C, 0xD6BA, 0xC638, 0xB596, 0x94B2, 0x738E, 0x4228, 0x18C3, 0x0020, 0x0000, 0x0000, // 0x3230 (12848) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0841, 0x2124, 0x39E7, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x31A6, 0x10A2, 0x0000, 0x0000, // 0x3240 (12864) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4208, 0xD69A, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0x6B4D, 0x0000, 0x0000, 0x8C51, // 0x3250 (12880) pixels + 0xDEDB, 0xEF7D, 0xFFDF, 0xF79E, 0xB5B6, 0x4A69, 0x0000, 0x0000, 0x4A49, 0xDEFB, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3260 (12896) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3270 (12912) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3280 (12928) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3290 (12944) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x32A0 (12960) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xE73C, 0xCE59, 0xC638, // 0x32B0 (12976) pixels + 0xC638, 0xCE59, 0xE73C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x32C0 (12992) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x32D0 (13008) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x32E0 (13024) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x32F0 (13040) pixels + 0xEF7D, 0x39E7, 0x0000, 0x1082, 0xD69A, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xAD75, 0x18E3, 0x0000, 0x0000, // 0x3300 (13056) pixels + 0x0000, 0x18C3, 0x4228, 0x73AE, 0xA534, 0xD69A, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF7D, 0x4A49, 0x0000, 0x0020, 0xBDD7, // 0x3310 (13072) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xEF7D, 0xD6BA, 0xB5B6, 0x9CD3, 0x5ACB, // 0x3320 (13088) pixels + 0x18C3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x3330 (13104) pixels + 0x1082, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C51, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0x6B6D, 0x0000, 0x0000, 0xAD75, // 0x3340 (13120) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xDEDB, 0x4A49, 0x0000, 0x0000, 0x8410, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3350 (13136) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3360 (13152) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3370 (13168) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3380 (13184) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3390 (13200) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF7D, 0xCE59, // 0x33A0 (13216) pixels + 0xC638, 0xC638, 0xC638, 0xE71C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x33B0 (13232) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x33C0 (13248) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x33D0 (13264) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x33E0 (13280) pixels + 0xF79E, 0x4A69, 0x0000, 0x0841, 0xC638, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7BE, 0xB596, 0x4228, 0x0020, // 0x33F0 (13296) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2104, 0x6B4D, 0xB5B6, 0xDEFB, 0xF79E, 0xFFDF, 0xCE79, 0x18C3, 0x0000, 0x3186, 0xE71C, // 0x3400 (13312) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF79E, // 0x3410 (13328) pixels + 0xCE79, 0xAD55, 0x8C71, 0x6B6D, 0x4A49, 0x2124, 0x10A2, 0x1082, 0x1082, 0x1082, 0x1082, 0x1082, 0x1082, 0x2124, 0x5ACB, 0xA534, // 0x3420 (13344) pixels + 0xCE59, 0x4A69, 0x0000, 0x0000, 0x10A2, 0x0020, 0x0000, 0x6B6D, 0xBDF7, 0xAD75, 0x94B2, 0x8C71, 0x39E7, 0x0000, 0x0000, 0x6B4D, // 0x3430 (13360) pixels + 0xBDF7, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, 0x7BEF, 0x0841, 0x0000, 0x18C3, 0xBDF7, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3440 (13376) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3450 (13392) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3460 (13408) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3470 (13424) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3480 (13440) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF7D, // 0x3490 (13456) pixels + 0xCE59, 0xC638, 0xC638, 0xC638, 0xDEFB, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x34A0 (13472) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x34B0 (13488) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x34C0 (13504) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x34D0 (13520) pixels + 0xFFDF, 0x632C, 0x0000, 0x0000, 0xB596, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xE73C, 0xA534, // 0x34E0 (13536) pixels + 0x632C, 0x3186, 0x0861, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x2124, 0x4A49, 0x73AE, 0x5AEB, 0x0000, 0x0000, 0x6B6D, 0xFFDF, // 0x34F0 (13552) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3500 (13568) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xF79E, 0xDEFB, 0xD69A, 0xCE79, 0xCE79, 0xCE79, 0xCE79, 0xCE79, 0xD69A, 0xDEFB, 0xF79E, 0xFFFF, // 0x3510 (13584) pixels + 0xE73C, 0x31A6, 0x0000, 0x0000, 0x0841, 0x0000, 0x0000, 0x0020, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x3520 (13600) pixels + 0x0020, 0x0841, 0x0841, 0x0841, 0x0841, 0x0841, 0x0841, 0x0000, 0x0000, 0x0000, 0x5ACB, 0xF79E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3530 (13616) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3540 (13632) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3550 (13648) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3560 (13664) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3570 (13680) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3580 (13696) pixels + 0xF79E, 0xCE79, 0xC638, 0xC638, 0xC638, 0xDEDB, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3590 (13712) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x35A0 (13728) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x35B0 (13744) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x35C0 (13760) pixels + 0xFFFF, 0x73AE, 0x0000, 0x0000, 0xAD55, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x35D0 (13776) pixels + 0xF7BE, 0xE71C, 0xC638, 0x9CF3, 0x632C, 0x2104, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x632C, 0xCE79, // 0x35E0 (13792) pixels + 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x35F0 (13808) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3600 (13824) pixels + 0xE73C, 0x31A6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x3610 (13840) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1082, 0xCE59, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3620 (13856) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3630 (13872) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3640 (13888) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3650 (13904) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3660 (13920) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3670 (13936) pixels + 0xFFFF, 0xF7BE, 0xD69A, 0xC638, 0xC638, 0xC638, 0xCE79, 0xEF5D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3680 (13952) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3690 (13968) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x36A0 (13984) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x36B0 (14000) pixels + 0xFFFF, 0x7BCF, 0x0000, 0x0000, 0xA534, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x36C0 (14016) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7BE, 0xD69A, 0x9492, 0x528A, 0x2124, 0x0841, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x18C3, // 0x36D0 (14032) pixels + 0x6B6D, 0xCE79, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x36E0 (14048) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x36F0 (14064) pixels + 0xFFDF, 0x7BEF, 0x0000, 0x0000, 0x1082, 0x4A49, 0x528A, 0x528A, 0x528A, 0x630C, 0x8410, 0x9492, 0x6B6D, 0x0000, 0x0000, 0x0000, // 0x3700 (14080) pixels + 0x4208, 0x528A, 0x528A, 0x528A, 0x528A, 0x528A, 0x4A69, 0x31A6, 0x0841, 0x0000, 0x0000, 0xAD75, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3710 (14096) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3720 (14112) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3730 (14128) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3740 (14144) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3750 (14160) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3760 (14176) pixels + 0xFFFF, 0xFFFF, 0xF7BE, 0xD69A, 0xC638, 0xC638, 0xC638, 0xC638, 0xD69A, 0xEF7D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3770 (14192) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3780 (14208) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3790 (14224) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x37A0 (14240) pixels + 0xFFFF, 0x7BCF, 0x0000, 0x0000, 0xA534, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x37B0 (14256) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF79E, 0xDEFB, 0xC618, 0x528A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x37C0 (14272) pixels + 0x0000, 0x2124, 0x7BEF, 0xC618, 0xEF5D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x37D0 (14288) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x37E0 (14304) pixels + 0xFFFF, 0xBDF7, 0x18C3, 0x0000, 0x0861, 0xA514, 0xF79E, 0xF7BE, 0xF7BE, 0xF7BE, 0xFFFF, 0xFFFF, 0xC638, 0x0000, 0x0000, 0x0000, // 0x37F0 (14320) pixels + 0xBDD7, 0xF7BE, 0xF7BE, 0xF7BE, 0xF7BE, 0xF7BE, 0xF79E, 0xE73C, 0x630C, 0x0000, 0x0000, 0xA534, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3800 (14336) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3810 (14352) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3820 (14368) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3830 (14384) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3840 (14400) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3850 (14416) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xDEDB, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, 0xD6BA, 0xF79E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3860 (14432) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3870 (14448) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3880 (14464) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3890 (14480) pixels + 0xFFFF, 0x7BCF, 0x0000, 0x0000, 0xA534, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x38A0 (14496) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF79E, 0x4A69, 0x0000, 0x0020, 0x7BCF, 0x6B6D, 0x2104, // 0x38B0 (14512) pixels + 0x0000, 0x0000, 0x0000, 0x0861, 0x4208, 0x7BCF, 0x9CD3, 0xB5B6, 0xB5B6, 0x9CD3, 0x8C71, 0x8C71, 0x8C51, 0x8C51, 0x94B2, 0xAD75, // 0x38C0 (14528) pixels + 0xBDF7, 0xC638, 0xCE59, 0xDEDB, 0xE73C, 0xEF5D, 0xEF5D, 0xEF5D, 0xEF5D, 0xEF5D, 0xEF5D, 0xEF5D, 0xEF5D, 0xEF5D, 0xEF5D, 0xD6BA, // 0x38D0 (14544) pixels + 0x94B2, 0x39E7, 0x0020, 0x0000, 0x0000, 0x31A6, 0xCE79, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xC618, 0x0000, 0x0000, 0x0000, // 0x38E0 (14560) pixels + 0xC618, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF79E, 0x4A69, 0x0000, 0x0000, 0xB5B6, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x38F0 (14576) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3900 (14592) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3910 (14608) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3920 (14624) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3930 (14640) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3940 (14656) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF5D, 0xD69A, 0xC638, 0xC638, 0xC638, 0xC638, 0xCE59, 0xE71C, 0xFFDF, 0xFFFF, 0xFFFF, // 0x3950 (14672) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3960 (14688) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3970 (14704) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3980 (14720) pixels + 0xFFFF, 0x8430, 0x0000, 0x0000, 0x94B2, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3990 (14736) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xCE79, 0x18C3, 0x0000, 0x2965, 0xDEFB, 0xFFDF, 0xCE79, // 0x39A0 (14752) pixels + 0x6B6D, 0x10A2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x39B0 (14768) pixels + 0x0020, 0x0841, 0x0861, 0x18E3, 0x2965, 0x31A6, 0x31A6, 0x31A6, 0x31A6, 0x31A6, 0x31A6, 0x31A6, 0x31A6, 0x31A6, 0x3186, 0x18C3, // 0x39C0 (14784) pixels + 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x52AA, 0xD6BA, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xB5B6, 0x0000, 0x0000, 0x0000, // 0x39D0 (14800) pixels + 0xC618, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xC638, 0x10A2, 0x0000, 0x2124, 0xDEDB, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x39E0 (14816) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x39F0 (14832) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3A00 (14848) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3A10 (14864) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3A20 (14880) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7BE, 0xF7BE, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3A30 (14896) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xE73C, 0xCE79, 0xC638, 0xC638, 0xC638, 0xC638, 0xD69A, 0xEF7D, 0xFFFF, // 0x3A40 (14912) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3A50 (14928) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3A60 (14944) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3A70 (14960) pixels + 0xFFFF, 0xA534, 0x0000, 0x0000, 0x73AE, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3A80 (14976) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0x8C51, 0x0000, 0x0000, 0x738E, 0xFFDF, 0xFFFF, 0xFFFF, // 0x3A90 (14992) pixels + 0xF7BE, 0xC618, 0x7BEF, 0x39E7, 0x0841, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x3AA0 (15008) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x3AB0 (15024) pixels + 0x0000, 0x0000, 0x2945, 0x8430, 0x39E7, 0x0000, 0x0000, 0x39C7, 0x9CF3, 0xEF5D, 0xFFFF, 0xFFFF, 0xAD55, 0x0000, 0x0000, 0x10A2, // 0x3AC0 (15040) pixels + 0xD69A, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF79E, 0x6B4D, 0x0000, 0x0000, 0x6B4D, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3AD0 (15056) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3AE0 (15072) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3AF0 (15088) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3B00 (15104) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3B10 (15120) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF5D, 0xCE59, 0xCE59, 0xCE79, 0xD6BA, 0xEF7D, 0xFFFF, // 0x3B20 (15136) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xE71C, 0xCE59, 0xC638, 0xC638, 0xC638, 0xC638, 0xD6BA, // 0x3B30 (15152) pixels + 0xF79E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3B40 (15168) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3B50 (15184) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3B60 (15200) pixels + 0xFFFF, 0xB5B6, 0x0000, 0x0000, 0x632C, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3B70 (15216) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xDEFB, 0x3186, 0x0000, 0x0861, 0xBDD7, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3B80 (15232) pixels + 0xFFFF, 0xFFFF, 0xFFDF, 0xE73C, 0xBDF7, 0x9CD3, 0x8410, 0x630C, 0x5ACB, 0x73AE, 0x9492, 0x9492, 0x9492, 0x8C71, 0x8C51, 0x6B6D, // 0x3B90 (15248) pixels + 0x5ACB, 0x528A, 0x4A49, 0x3186, 0x18E3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x18C3, 0x2104, // 0x3BA0 (15264) pixels + 0x4A49, 0x9492, 0xD6BA, 0xFFDF, 0xBDF7, 0x3186, 0x0000, 0x0000, 0x0020, 0x528A, 0xAD75, 0xDEFB, 0x9CF3, 0x0000, 0x0000, 0x52AA, // 0x3BB0 (15280) pixels + 0xF79E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF79E, 0x94B2, 0x0861, 0x0000, 0x2124, 0xC638, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3BC0 (15296) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3BD0 (15312) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3BE0 (15328) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3BF0 (15344) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3C00 (15360) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xDEFB, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, 0xD6BA, // 0x3C10 (15376) pixels + 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF79E, 0xD6BA, 0xC638, 0xC638, 0xC638, 0xC638, // 0x3C20 (15392) pixels + 0xC638, 0xD6BA, 0xEF7D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3C30 (15408) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3C40 (15424) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3C50 (15440) pixels + 0xFFFF, 0xC618, 0x0020, 0x0000, 0x528A, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3C60 (15456) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x9CF3, 0x0000, 0x0000, 0x52AA, 0xEF7D, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3C70 (15472) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7BE, 0xF7BE, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, // 0x3C80 (15488) pixels + 0xF7BE, 0xF7BE, 0xF79E, 0xE73C, 0xDEDB, 0xDEDB, 0xDEDB, 0xDEDB, 0xDEDB, 0xDEDB, 0xDEDB, 0xDEDB, 0xDEDB, 0xDEDB, 0xDEDB, 0xDEFB, // 0x3C90 (15504) pixels + 0xEF7D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xC638, 0x52AA, 0x0841, 0x0000, 0x0000, 0x0020, 0x3186, 0x4208, 0x0000, 0x0000, 0x7BCF, // 0x3CA0 (15520) pixels + 0xFFDF, 0xFFFF, 0xFFFF, 0xFFDF, 0xDEDB, 0x7BCF, 0x1082, 0x0000, 0x0841, 0x9492, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3CB0 (15536) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3CC0 (15552) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3CD0 (15568) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3CE0 (15584) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3CF0 (15600) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF79E, 0xCE59, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, // 0x3D00 (15616) pixels + 0xCE59, 0xEF5D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF5D, 0xCE79, 0xC638, 0xC638, // 0x3D10 (15632) pixels + 0xC638, 0xC638, 0xC638, 0xD69A, 0xE71C, 0xEF7D, 0xF7BE, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3D20 (15648) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3D30 (15664) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF7D, 0xDEFB, 0xEF7D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3D40 (15680) pixels + 0xFFFF, 0xD6BA, 0x10A2, 0x0000, 0x39C7, 0xEF5D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3D50 (15696) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF5D, 0x4A49, 0x0000, 0x0020, 0xAD55, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3D60 (15712) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3D70 (15728) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3D80 (15744) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF5D, 0xA514, 0x39C7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x31A6, // 0x3D90 (15760) pixels + 0x8C51, 0xA534, 0xA514, 0x738E, 0x2945, 0x0000, 0x0000, 0x0841, 0x7BCF, 0xEF7D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3DA0 (15776) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3DB0 (15792) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3DC0 (15808) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3DD0 (15824) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3DE0 (15840) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF79E, 0xE73C, 0xDEFB, 0xCE79, 0xC638, 0xC638, // 0x3DF0 (15856) pixels + 0xC638, 0xC638, 0xDEFB, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xE71C, 0xCE79, // 0x3E00 (15872) pixels + 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, 0xCE59, 0xCE79, 0xD6BA, 0xDEFB, 0xE73C, 0xEF7D, 0xF7BE, 0xFFDF, 0xFFFF, 0xFFFF, // 0x3E10 (15888) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3E20 (15904) pixels + 0xFFFF, 0xFFFF, 0xF7BE, 0xDEFB, 0xC638, 0xC638, 0xCE79, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3E30 (15920) pixels + 0xFFFF, 0xDEFB, 0x2104, 0x0000, 0x2945, 0xE71C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3E40 (15936) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xAD55, 0x0841, 0x0000, 0x39E7, 0xE73C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, // 0x3E50 (15952) pixels + 0xF7BE, 0xF7BE, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3E60 (15968) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3E70 (15984) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xDEFB, 0x9CD3, 0x528A, 0x1082, 0x0000, 0x0000, 0x0000, 0x0000, // 0x3E80 (16000) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x18C3, 0x9492, 0xEF7D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3E90 (16016) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3EA0 (16032) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3EB0 (16048) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3EC0 (16064) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3ED0 (16080) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xDEFB, 0xCE59, // 0x3EE0 (16096) pixels + 0xC638, 0xC638, 0xC638, 0xD69A, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, // 0x3EF0 (16112) pixels + 0xE73C, 0xCE79, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, 0xCE59, 0xD69A, 0xD6BA, // 0x3F00 (16128) pixels + 0xE71C, 0xEF5D, 0xEF7D, 0xF7BE, 0xF7BE, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xF7BE, 0xF7BE, // 0x3F10 (16144) pixels + 0xEF7D, 0xDEFB, 0xCE79, 0xC638, 0xC638, 0xC638, 0xCE79, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3F20 (16160) pixels + 0xFFFF, 0xE71C, 0x3186, 0x0000, 0x0841, 0xA514, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3F30 (16176) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xD69A, 0x39E7, 0x0000, 0x0020, 0x9492, 0xD6BA, 0xC618, 0xA514, 0x7BEF, 0x630C, // 0x3F40 (16192) pixels + 0x52AA, 0x5ACB, 0x73AE, 0x9492, 0x9CD3, 0x9CD3, 0x9CD3, 0x9CD3, 0x94B2, 0x94B2, 0x9CD3, 0xA514, 0xB596, 0xC618, 0xCE59, 0xCE79, // 0x3F50 (16208) pixels + 0xDEFB, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3F60 (16224) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF7D, 0xBDD7, 0x31A6, 0x0000, 0x0000, 0x0000, // 0x3F70 (16240) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0841, 0x4A69, 0xB596, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3F80 (16256) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3F90 (16272) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3FA0 (16288) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3FB0 (16304) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3FC0 (16320) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF7D, // 0x3FD0 (16336) pixels + 0xCE79, 0xC638, 0xC638, 0xC638, 0xCE79, 0xEF7D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x3FE0 (16352) pixels + 0xFFFF, 0xFFDF, 0xEF5D, 0xD6BA, 0xCE79, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, // 0x3FF0 (16368) pixels + 0xC638, 0xC638, 0xC638, 0xC638, 0xCE59, 0xCE59, 0xCE59, 0xCE59, 0xCE59, 0xCE59, 0xCE59, 0xCE59, 0xCE59, 0xCE59, 0xCE59, 0xC638, // 0x4000 (16384) pixels + 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, 0xCE79, 0xEF5D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4010 (16400) pixels + 0xFFFF, 0xF7BE, 0x73AE, 0x0000, 0x0000, 0x2945, 0xBDF7, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4020 (16416) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF5D, 0x5ACB, 0x0000, 0x0000, 0x528A, 0x9CD3, 0x2965, 0x0000, 0x0000, 0x0000, 0x0000, // 0x4030 (16432) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0841, 0x1082, // 0x4040 (16448) pixels + 0x2124, 0x5AEB, 0xA514, 0xE71C, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4050 (16464) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0x5AEB, 0x0000, 0x0000, 0x73AE, // 0x4060 (16480) pixels + 0x8C71, 0x6B6D, 0x6B4D, 0x9492, 0xBDF7, 0xEF5D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4070 (16496) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4080 (16512) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4090 (16528) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x40A0 (16544) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x40B0 (16560) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x40C0 (16576) pixels + 0xF7BE, 0xD6BA, 0xC638, 0xC638, 0xC638, 0xCE59, 0xE73C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x40D0 (16592) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xF7BE, 0xEF7D, 0xE71C, 0xDEDB, 0xD69A, 0xCE59, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, // 0x40E0 (16608) pixels + 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, // 0x40F0 (16624) pixels + 0xC638, 0xC638, 0xC638, 0xC638, 0xDEDB, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFF7D, 0xFEFB, 0xFEBA, 0xFEFB, // 0x4100 (16640) pixels + 0xFF5D, 0xFF9E, 0xDE9A, 0x5A8A, 0x0000, 0x0000, 0x39C7, 0xCE18, 0xFF9E, 0xFF9E, 0xFF9E, 0xFF7D, 0xFF5D, 0xFF1C, 0xFEDB, 0xFEBA, // 0x4110 (16656) pixels + 0xFEBA, 0xFEBA, 0xFEBA, 0xFEBA, 0xFE9A, 0x9C71, 0x0020, 0x0000, 0x3904, 0xCD14, 0x8BEF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x4120 (16672) pixels + 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x4130 (16688) pixels + 0x0000, 0x0000, 0x0020, 0x31A6, 0x7BCF, 0xAD55, 0xCE79, 0xE73C, 0xF79E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4140 (16704) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF7D, 0x39E7, 0x0000, 0x0841, 0xC618, // 0x4150 (16720) pixels + 0xFFFF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4160 (16736) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4170 (16752) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4180 (16768) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4190 (16784) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x41A0 (16800) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x41B0 (16816) pixels + 0xFFFF, 0xFFFF, 0xE71C, 0xCE59, 0xC638, 0xC638, 0xC638, 0xE73C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x41C0 (16832) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xF7BE, 0xEF7D, 0xE73C, 0xDEFB, 0xD6BA, // 0x41D0 (16848) pixels + 0xCE79, 0xCE59, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, // 0x41E0 (16864) pixels + 0xCE59, 0xCE79, 0xDEDB, 0xEF7D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFBE, 0xFEBA, 0xFD96, 0xFC71, 0xFB4D, 0xFA28, 0xF924, 0xF8C3, 0xF904, // 0x41F0 (16880) pixels + 0xF9A6, 0xFA28, 0xFA49, 0xD9A6, 0x5800, 0x0000, 0x0000, 0x6104, 0xF249, 0xFA49, 0xFA49, 0xF9E7, 0xF986, 0xF945, 0xF8E3, 0xF8A2, // 0x4200 (16896) pixels + 0xF8A2, 0xF8A2, 0xF8A2, 0xF8A2, 0xE082, 0x3800, 0x0000, 0x0000, 0xA020, 0xF8E3, 0xD0C3, 0x4000, 0x0000, 0x0000, 0x0000, 0x80E3, // 0x4210 (16912) pixels + 0xB9E7, 0xBA28, 0xA208, 0x8A08, 0x8A8A, 0x8B4D, 0x8BCF, 0x8410, 0x8430, 0x8430, 0x8430, 0x7BEF, 0x6B4D, 0x5ACB, 0x4A49, 0x39C7, // 0x4220 (16928) pixels + 0x18C3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1082, 0x2965, 0x528A, 0x8410, 0xB5B6, 0xE71C, 0xF79E, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4230 (16944) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xD6BA, 0x18C3, 0x0000, 0x2124, 0xDEFB, // 0x4240 (16960) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4250 (16976) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4260 (16992) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4270 (17008) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4280 (17024) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4290 (17040) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x42A0 (17056) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xEF5D, 0xCE59, 0xC638, 0xC638, 0xC638, 0xE73C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x42B0 (17072) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x42C0 (17088) pixels + 0xFFFF, 0xFFDF, 0xF7BE, 0xEF7D, 0xEF7D, 0xEF7D, 0xEF7D, 0xEF7D, 0xEF7D, 0xEF7D, 0xEF7D, 0xEF7D, 0xEF7D, 0xEF7D, 0xEF7D, 0xF79E, // 0x42D0 (17104) pixels + 0xF7BE, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFF9E, 0xFDD7, 0xFB0C, 0xF904, 0xF820, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x42E0 (17120) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xC800, 0x1800, 0x0000, 0x2000, 0xD800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x42F0 (17136) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0x9000, 0x0000, 0x0000, 0x4800, 0xE800, 0xF800, 0xF800, 0xE000, 0x9000, 0x5000, 0x7000, 0xD800, // 0x4300 (17152) pixels + 0xF800, 0xF800, 0xF800, 0xF841, 0xF8C3, 0xF9A6, 0xFAAA, 0xFBEF, 0xFD55, 0xFE9A, 0xFF9E, 0xFFDF, 0xFFDF, 0xF7BE, 0xF79E, 0xEF7D, // 0x4310 (17168) pixels + 0xD6BA, 0xA514, 0x528A, 0x1082, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x2945, 0x528A, 0x8410, 0xB596, 0xDEFB, // 0x4320 (17184) pixels + 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xC618, 0x0841, 0x0000, 0x4A49, 0xF79E, // 0x4330 (17200) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4340 (17216) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4350 (17232) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4360 (17248) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4370 (17264) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4380 (17280) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4390 (17296) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF79E, 0xCE79, 0xC638, 0xC638, 0xC638, 0xE73C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x43A0 (17312) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x43B0 (17328) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x43C0 (17344) pixels + 0xFFFF, 0xFFDF, 0xFF3C, 0xFE59, 0xFD14, 0xFAEB, 0xF882, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF861, 0xF924, 0xF9A6, 0xF945, // 0x43D0 (17360) pixels + 0xF8A2, 0xF861, 0xF841, 0xF841, 0xE841, 0x4000, 0x0000, 0x0000, 0x9800, 0xF841, 0xF861, 0xF882, 0xF8E3, 0xF924, 0xF986, 0xF9C7, // 0x43E0 (17376) pixels + 0xF9E7, 0xF9E7, 0xF9E7, 0xD145, 0x3000, 0x0000, 0x0800, 0xA945, 0xF9C7, 0xF986, 0xF8C3, 0xF861, 0xF841, 0xF020, 0xF000, 0xF800, // 0x43F0 (17392) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF8E3, 0xFAAA, 0xFCB2, 0xFE59, 0xFF9E, 0xFFFF, 0xFFFF, // 0x4400 (17408) pixels + 0xFFFF, 0xFFFF, 0xEF7D, 0xC638, 0x94B2, 0x6B4D, 0x39E7, 0x18E3, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x2945, // 0x4410 (17424) pixels + 0x5ACB, 0x8410, 0x94B2, 0x9CD3, 0xAD75, 0xC618, 0xCE59, 0xCE59, 0xBDF7, 0xB5B6, 0xE73C, 0xC618, 0x0020, 0x0000, 0x5ACB, 0xF7BE, // 0x4420 (17440) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4430 (17456) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4440 (17472) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4450 (17488) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4460 (17504) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4470 (17520) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4480 (17536) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF79E, 0xCE79, 0xC638, 0xC638, 0xCE59, 0xEF5D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4490 (17552) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x44A0 (17568) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFF5D, 0xFE79, 0xFD75, // 0x44B0 (17584) pixels + 0xFC92, 0xFB4D, 0xF9C7, 0xF882, 0xF800, 0xF800, 0xF800, 0xF800, 0xF924, 0xFACB, 0xFC30, 0xFC51, 0xFC71, 0xFC10, 0xFBEF, 0xFBEF, // 0x44C0 (17600) pixels + 0xFC51, 0xFC10, 0xFC10, 0xFC10, 0xFC10, 0x81C7, 0x0000, 0x0000, 0x1820, 0x8A28, 0xDBAE, 0xFC51, 0xFC30, 0xFBEF, 0xFC30, 0xFBCF, // 0x44D0 (17616) pixels + 0xFBAE, 0xFBAE, 0xFBAE, 0x8228, 0x0000, 0x0000, 0x58A2, 0xEB4D, 0xFBAE, 0xFC10, 0xFC51, 0xFC30, 0xFC10, 0xFC71, 0xFC51, 0xFC51, // 0x44E0 (17632) pixels + 0xFC51, 0xFC10, 0xFB6D, 0xFA8A, 0xF986, 0xF8C3, 0xF820, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF8A2, 0xFAEB, 0xFD55, 0xFE79, // 0x44F0 (17648) pixels + 0xFEFB, 0xFF7D, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFDF, 0xEF5D, 0xDEDB, 0xBDF7, 0x8C51, 0x4A49, 0x18E3, 0x0020, 0x0000, 0x0000, 0x0000, // 0x4500 (17664) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0841, 0x0841, 0x0020, 0x0000, 0x5AEB, 0xAD55, 0x0020, 0x0000, 0x5ACB, 0xF7BE, // 0x4510 (17680) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4520 (17696) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4530 (17712) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4540 (17728) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4550 (17744) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4560 (17760) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4570 (17776) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF79E, 0xCE79, 0xC638, 0xC638, 0xCE79, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4580 (17792) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4590 (17808) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFF7D, 0xFE79, 0xFD14, 0xFB6D, 0xF9C7, 0xF882, 0xF800, // 0x45A0 (17824) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF945, 0xFC10, 0xFC51, 0xFB8E, 0xF861, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x45B0 (17840) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xD800, 0x5000, 0x0000, 0x0000, 0x0000, 0x3800, 0xB800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x45C0 (17856) pixels + 0xF800, 0xF800, 0xB800, 0x1800, 0x0000, 0x1000, 0xB800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x45D0 (17872) pixels + 0xF841, 0xF861, 0xFAEB, 0xFBAE, 0xFC10, 0xFC30, 0xFC51, 0xFC51, 0xFB2C, 0xF945, 0xF820, 0xF800, 0xF800, 0xF800, 0xF800, 0xF882, // 0x45E0 (17888) pixels + 0xF924, 0xFA08, 0xFB4D, 0xFCB2, 0xFDD7, 0xFEDB, 0xFF9E, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF7D, 0xDEDB, 0xBDF7, 0x8C71, 0x528A, 0x18E3, // 0x45F0 (17904) pixels + 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3186, 0x94B2, 0x0020, 0x0000, 0x5ACB, 0xF7BE, // 0x4600 (17920) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4610 (17936) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4620 (17952) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4630 (17968) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4640 (17984) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4650 (18000) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4660 (18016) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF7D, 0xC638, 0xC638, 0xC638, 0xDEFB, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4670 (18032) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4680 (18048) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFBE, 0xFE79, 0xFC92, 0xFA49, 0xF8A2, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x4690 (18064) pixels + 0xF800, 0xF800, 0xF882, 0xF9E7, 0xFB8E, 0xFC71, 0xFC71, 0xFA8A, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x46A0 (18080) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xD800, 0x7000, 0x1000, 0x0000, 0x0000, 0x5000, 0xE800, 0xF800, 0xF800, 0xF800, // 0x46B0 (18096) pixels + 0xF800, 0xE800, 0x5000, 0x0000, 0x0000, 0x4800, 0xE800, 0xF800, 0xF800, 0xE800, 0xC800, 0xC000, 0xD000, 0xE000, 0xF000, 0xF800, // 0x46C0 (18112) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF8A2, 0xFB0C, 0xFC51, 0xFC71, 0xFB8E, 0xF965, 0xF800, 0xF800, 0xF800, // 0x46D0 (18128) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF820, 0xF904, 0xFA8A, 0xFCD3, 0xFEDB, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF79E, 0xD6BA, // 0x46E0 (18144) pixels + 0xBDD7, 0x9CD3, 0x8C71, 0x8430, 0x6B6D, 0x528A, 0x4A49, 0x4A49, 0x4208, 0x4A49, 0xA514, 0xB5B6, 0x0020, 0x0000, 0x5ACB, 0xF7BE, // 0x46F0 (18160) pixels + 0xFFFF, 0xFFFF, 0xFFDF, 0xE73C, 0xE73C, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4700 (18176) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4710 (18192) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4720 (18208) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4730 (18224) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4740 (18240) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4750 (18256) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xDEDB, 0xC638, 0xC638, 0xCE59, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4760 (18272) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4770 (18288) pixels + 0xFFFF, 0xFFFF, 0xFFDF, 0xFF9E, 0xFEFB, 0xFD75, 0xFB0C, 0xF8E3, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF882, 0xF9C7, 0xFB4D, // 0x4780 (18304) pixels + 0xFC51, 0xFC51, 0xFC51, 0xFC10, 0xFAAA, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x4790 (18320) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF000, 0x7800, 0x0000, 0x0000, 0x4000, 0xE800, 0xF800, 0xF800, 0xF800, // 0x47A0 (18336) pixels + 0xF800, 0xE800, 0x5000, 0x0000, 0x0000, 0x1000, 0x7000, 0xB000, 0xA800, 0x7000, 0x1800, 0x0800, 0x1000, 0x2800, 0x4000, 0x6000, // 0x47B0 (18352) pixels + 0x8000, 0xA800, 0xC800, 0xE000, 0xF000, 0xF000, 0xF000, 0xF000, 0xF800, 0xF800, 0xF800, 0xFA8A, 0xFC51, 0xFC71, 0xFB0C, 0xFA08, // 0x47C0 (18368) pixels + 0xF924, 0xF861, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF986, 0xFC71, 0xFEFB, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x47D0 (18384) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xF79E, 0xF79E, 0xF79E, 0xF79E, 0xF79E, 0xFFFF, 0xC618, 0x0020, 0x0000, 0x5ACB, 0xF7BE, // 0x47E0 (18400) pixels + 0xFFFF, 0xFFDF, 0xB5B6, 0x4228, 0x31A6, 0x630C, 0x9CD3, 0xCE59, 0xEF5D, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x47F0 (18416) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4800 (18432) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4810 (18448) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4820 (18464) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4830 (18480) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4840 (18496) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF79E, 0xCE59, 0xC638, 0xC638, 0xDEFB, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4850 (18512) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, // 0x4860 (18528) pixels + 0xFEDB, 0xFD55, 0xFBCF, 0xFA8A, 0xF924, 0xF820, 0xF800, 0xF800, 0xF800, 0xF820, 0xF986, 0xFB6D, 0xFC51, 0xFC71, 0xFBEF, 0xFB0C, // 0x4870 (18544) pixels + 0xF841, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x4880 (18560) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xE800, 0x5800, 0x0000, 0x0000, 0x8800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x4890 (18576) pixels + 0xF800, 0xF800, 0xC000, 0x4800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x48A0 (18592) pixels + 0x0000, 0x0000, 0x1000, 0x2800, 0x4800, 0x5000, 0x5000, 0x5800, 0x6800, 0x7800, 0x8800, 0xA000, 0xB800, 0xC104, 0xCB4D, 0xCBAE, // 0x48B0 (18608) pixels + 0xCBEF, 0xCBCF, 0xDB6D, 0xEB0C, 0xEA08, 0xE8E3, 0xE800, 0xF000, 0xF800, 0xF800, 0xF9E7, 0xFD14, 0xFF5D, 0xFFFF, 0xFFFF, 0xFFFF, // 0x48C0 (18624) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xBDF7, 0x0020, 0x0000, 0x5ACB, 0xF7BE, // 0x48D0 (18640) pixels + 0xFFFF, 0xFFDF, 0x8C51, 0x0000, 0x0000, 0x0000, 0x0000, 0x1082, 0x39C7, 0x632C, 0x8430, 0x9CF3, 0xB5B6, 0xD69A, 0xEF7D, 0xFFFF, // 0x48E0 (18656) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x48F0 (18672) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4900 (18688) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4910 (18704) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4920 (18720) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4930 (18736) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xDEDB, 0xC638, 0xC638, 0xCE59, 0xF7BE, 0xFFFF, 0xFFFF, // 0x4940 (18752) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFE79, 0xFBAE, // 0x4950 (18768) pixels + 0xF945, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF924, 0xFB6D, 0xFC71, 0xFC10, 0xFB0C, 0xF800, 0xF800, 0xF800, 0xF800, // 0x4960 (18784) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x4970 (18800) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xB800, 0x0800, 0x0000, 0x3000, 0xD800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x4980 (18816) pixels + 0xF800, 0xF800, 0xF800, 0xE000, 0x8000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1800, 0x3000, 0x2000, 0x0800, 0x0000, // 0x4990 (18832) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x0800, 0x0800, // 0x49A0 (18848) pixels + 0x0800, 0x1000, 0x2000, 0x30A2, 0x3965, 0x3904, 0x4061, 0x5000, 0x7000, 0x8800, 0xA000, 0xB020, 0xC249, 0xCCF3, 0xD679, 0xDEFB, // 0x49B0 (18864) pixels + 0xE73C, 0xF79E, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xB596, 0x0000, 0x0000, 0x5AEB, 0xF7BE, // 0x49C0 (18880) pixels + 0xFFFF, 0xFFFF, 0xD69A, 0x630C, 0x18E3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x18C3, 0x4A49, 0x8C51, // 0x49D0 (18896) pixels + 0xC618, 0xE73C, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x49E0 (18912) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x49F0 (18928) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4A00 (18944) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4A10 (18960) pixels + 0xFFFF, 0xEF7D, 0xEF5D, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4A20 (18976) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF79E, 0xCE59, 0xC638, 0xC638, 0xDEFB, 0xFFFF, 0xFFFF, // 0x4A30 (18992) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFE79, 0xFC10, 0xF924, 0xF800, // 0x4A40 (19008) pixels + 0xF800, 0xF800, 0xF800, 0xF820, 0xF904, 0xFA8A, 0xFC51, 0xFC51, 0xFB0C, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x4A50 (19024) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x4A60 (19040) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF000, 0x6800, 0x0000, 0x0000, 0x8800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x4A70 (19056) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xB800, 0x3800, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x6800, 0xA800, 0xC000, 0xB000, // 0x4A80 (19072) pixels + 0x9000, 0x6800, 0x4000, 0x1800, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x4A90 (19088) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x1841, 0x20E3, // 0x4AA0 (19104) pixels + 0x3186, 0x528A, 0x630C, 0x630C, 0x6B4D, 0x8430, 0xB596, 0xD6BA, 0xEF5D, 0xF7BE, 0xFFFF, 0x94B2, 0x0000, 0x0000, 0x7BEF, 0xFFFF, // 0x4AB0 (19120) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xF79E, 0xD6BA, 0xAD55, 0x738E, 0x39E7, 0x1082, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x4AC0 (19136) pixels + 0x0861, 0x31A6, 0x6B4D, 0xA514, 0xD69A, 0xEF7D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4AD0 (19152) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4AE0 (19168) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4AF0 (19184) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4B00 (19200) pixels + 0xF79E, 0xCE79, 0xC638, 0xD6BA, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4B10 (19216) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xDEFB, 0xC638, 0xC638, 0xCE59, 0xEF7D, 0xFFFF, // 0x4B20 (19232) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFF5D, 0xFC51, 0xF904, 0xF800, 0xF800, 0xF800, // 0x4B30 (19248) pixels + 0xF8C3, 0xFAEB, 0xFC51, 0xFC51, 0xFC51, 0xFBCF, 0xF904, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x4B40 (19264) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x4B50 (19280) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xC000, 0x1800, 0x0000, 0x0800, 0x9800, 0xC800, 0xD800, 0xF000, 0xF800, 0xF800, // 0x4B60 (19296) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xD800, 0x8000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2800, 0x7800, 0xC000, // 0x4B70 (19312) pixels + 0xF000, 0xF800, 0xE800, 0xD800, 0xC000, 0xC000, 0xC000, 0xB800, 0xB000, 0xA000, 0x9000, 0x7800, 0x6000, 0x4800, 0x4800, 0x4800, // 0x4B80 (19328) pixels + 0x4800, 0x4000, 0x2800, 0x1800, 0x1000, 0x1000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x4B90 (19344) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x18E3, 0x39E7, 0x630C, 0x9492, 0x5ACB, 0x0000, 0x0000, 0x94B2, 0xFFFF, // 0x4BA0 (19360) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xEF5D, 0xCE79, 0xB596, 0x9CD3, 0x7BEF, 0x5AEB, 0x3186, 0x0841, 0x0000, // 0x4BB0 (19376) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x18C3, 0x4A69, 0x9492, 0xCE79, 0xF79E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4BC0 (19392) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4BD0 (19408) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4BE0 (19424) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4BF0 (19440) pixels + 0xF79E, 0xCE59, 0xC638, 0xC638, 0xDEFB, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4C00 (19456) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7BE, 0xCE59, 0xC638, 0xC638, 0xCE79, 0xF79E, // 0x4C10 (19472) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFF3C, 0xFB6D, 0xF820, 0xF800, 0xF800, 0xF8A2, 0xFB6D, // 0x4C20 (19488) pixels + 0xFC71, 0xFB6D, 0xF8A2, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x4C30 (19504) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x4C40 (19520) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF000, 0x6000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x2000, 0x4800, 0x7800, 0x9800, // 0x4C50 (19536) pixels + 0xA800, 0xA800, 0xA000, 0x7800, 0x3000, 0x0000, 0x0000, 0x0000, 0x0800, 0x3800, 0x4800, 0x1000, 0x0000, 0x0000, 0x0000, 0x1000, // 0x4C60 (19552) pixels + 0x5800, 0xA000, 0xC800, 0xE000, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF000, 0xF000, 0xF000, 0xF000, // 0x4C70 (19568) pixels + 0xF000, 0xE800, 0xE000, 0xD000, 0xD000, 0xD000, 0xC800, 0xB800, 0xA000, 0x9000, 0x7800, 0x6041, 0x51A6, 0x40C3, 0x3000, 0x2800, // 0x4C80 (19584) pixels + 0x1800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xA514, 0xFFFF, // 0x4C90 (19600) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7BE, 0xE73C, 0xBDD7, 0x7BEF, // 0x4CA0 (19616) pixels + 0x4208, 0x10A2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x18C3, 0x5ACB, 0x9CD3, 0xC638, 0xE71C, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4CB0 (19632) pixels + 0xFFFF, 0xFFDF, 0xEF7D, 0xDEFB, 0xDEDB, 0xD6BA, 0xDEDB, 0xE71C, 0xEF5D, 0xF79E, 0xF79E, 0xD6BA, 0xB5B6, 0xAD55, 0xAD75, 0xAD75, // 0x4CC0 (19648) pixels + 0xAD55, 0xAD55, 0xBDD7, 0xDEDB, 0xF79E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4CD0 (19664) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4CE0 (19680) pixels + 0xFFFF, 0xD6BA, 0xC638, 0xC638, 0xC638, 0xDEDB, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4CF0 (19696) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xE73C, 0xC638, 0xC638, 0xC638, 0xCE59, // 0x4D00 (19712) pixels + 0xDEFB, 0xF79E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFF3C, 0xFB6D, 0xF820, 0xF800, 0xF8A2, 0xFB6D, 0xFC92, 0xFB4D, // 0x4D10 (19728) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x4D20 (19744) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x4D30 (19760) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xE000, 0x3800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x4D40 (19776) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x6000, 0xB000, 0xE800, 0xF000, 0xB800, 0x6000, 0x1000, 0x0000, 0x0000, // 0x4D50 (19792) pixels + 0x0000, 0x0000, 0x1000, 0x3800, 0x7000, 0xA800, 0xD800, 0xF000, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x4D60 (19808) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF124, 0xEBCF, 0xEC51, 0xE269, // 0x4D70 (19824) pixels + 0xD082, 0xB800, 0xB800, 0xB800, 0x9800, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xAC71, 0xFF9E, // 0x4D80 (19840) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, // 0x4D90 (19856) pixels + 0xEF7D, 0xCE79, 0xA514, 0x6B4D, 0x3186, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0861, 0x2965, 0x52AA, 0x7BCF, 0x9492, 0x94B2, // 0x4DA0 (19872) pixels + 0x8C51, 0x632C, 0x39E7, 0x2124, 0x18C3, 0x10A2, 0x18E3, 0x2945, 0x39C7, 0x4A49, 0x4A49, 0x2104, 0x0020, 0x0000, 0x0000, 0x0000, // 0x4DB0 (19888) pixels + 0x0000, 0x0000, 0x0020, 0x2104, 0x528A, 0x8410, 0x94B2, 0xA514, 0xBDD7, 0xCE59, 0xCE79, 0xDEDB, 0xEF7D, 0xFFDF, 0xFFFF, 0xFFFF, // 0x4DC0 (19904) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4DD0 (19920) pixels + 0xFFFF, 0xF7BE, 0xD69A, 0xC638, 0xC638, 0xC638, 0xE71C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4DE0 (19936) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xDEFB, 0xC638, 0xC638, 0xC638, // 0x4DF0 (19952) pixels + 0xC638, 0xC638, 0xCE79, 0xDEDB, 0xE73C, 0xF79E, 0xFFDF, 0xFF3C, 0xFB6D, 0xF820, 0xF800, 0xF945, 0xFC92, 0xFB2C, 0xF800, 0xF800, // 0x4E00 (19968) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x4E10 (19984) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x4E20 (20000) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0x9000, 0x2000, 0x2000, 0x4800, 0x5000, 0x4000, 0x2000, 0x0000, 0x0000, 0x0000, // 0x4E30 (20016) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x5000, 0xB800, 0xF000, 0xF800, 0xF800, 0xF800, 0xF800, 0xF000, 0xC000, 0x7800, 0x2800, // 0x4E40 (20032) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x5800, 0x8000, 0xB000, 0xD800, 0xF000, 0xF800, 0xF800, 0xF800, 0xF800, // 0x4E50 (20048) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF924, 0xFBCF, // 0x4E60 (20064) pixels + 0xFC71, 0xFC51, 0xFB4D, 0xFA08, 0xD8E3, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xA882, 0xFA8A, // 0x4E70 (20080) pixels + 0xFC51, 0xFD96, 0xFEBA, 0xFF9E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4E80 (20096) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xE71C, 0xB5B6, 0x6B6D, 0x2945, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x4E90 (20112) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x4EA0 (20128) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0841, 0x0861, 0x2104, 0x4228, 0x73AE, 0xAD75, 0xE73C, // 0x4EB0 (20144) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4EC0 (20160) pixels + 0xFFFF, 0xFFFF, 0xF7BE, 0xCE79, 0xC638, 0xC638, 0xCE59, 0xF79E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4ED0 (20176) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xE71C, 0xCE59, 0xC638, // 0x4EE0 (20192) pixels + 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, 0xCE18, 0xE34D, 0xF020, 0xF800, 0xF945, 0xFCD3, 0xFA8A, 0xF800, 0xF800, 0xF800, // 0x4EF0 (20208) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x4F00 (20224) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x4F10 (20240) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF000, 0xE000, 0xE000, 0xF000, 0xF000, 0xE800, 0xD800, 0xB800, 0x9800, 0x7800, // 0x4F20 (20256) pixels + 0x7000, 0x7000, 0x7000, 0x8800, 0xB800, 0xE800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xD800, // 0x4F30 (20272) pixels + 0xA000, 0x6800, 0x3800, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2800, 0x5800, 0x8800, 0xA800, 0xC800, 0xE800, // 0x4F40 (20288) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x4F50 (20304) pixels + 0xF800, 0xF800, 0xFB0C, 0xFBEF, 0xEBCF, 0x6945, 0x0800, 0x18A2, 0x5186, 0x6965, 0x88C3, 0x7820, 0x2000, 0x3800, 0xD000, 0xF800, // 0x4F60 (20320) pixels + 0xF800, 0xF800, 0xF8E3, 0xFAAA, 0xFCF3, 0xFEBA, 0xFF9E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4F70 (20336) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xDEDB, 0xAD55, 0x73AE, 0x4228, 0x18E3, 0x0020, 0x0000, 0x0000, 0x0000, // 0x4F80 (20352) pixels + 0x0000, 0x0000, 0x1082, 0x2124, 0x3186, 0x2965, 0x2965, 0x2124, 0x10A2, 0x0841, 0x0841, 0x2124, 0x5ACB, 0x738E, 0x738E, 0x738E, // 0x4F90 (20368) pixels + 0x6B6D, 0x6B4D, 0x52AA, 0x2945, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x4A49, // 0x4FA0 (20384) pixels + 0xAD75, 0xEF7D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4FB0 (20400) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xF79E, 0xCE59, 0xC638, 0xC638, 0xD6BA, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x4FC0 (20416) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF79E, 0xDEDB, // 0x4FD0 (20432) pixels + 0xCE59, 0xC638, 0xC638, 0xC638, 0xC638, 0xC5F7, 0xC36D, 0xC020, 0xC800, 0xD0C3, 0xEC51, 0xFA8A, 0xF800, 0xF800, 0xF800, 0xF800, // 0x4FE0 (20448) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x4FF0 (20464) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5000 (20480) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5010 (20496) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5020 (20512) pixels + 0xF800, 0xF800, 0xE800, 0xC800, 0x9800, 0x5800, 0x1800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x3800, // 0x5030 (20528) pixels + 0x8800, 0xC000, 0xE800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5040 (20544) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xE800, 0xC800, 0xD820, 0xF249, 0xFBAE, 0xFC30, 0xF430, 0xCBEF, 0xD34D, 0xF965, 0xF820, // 0x5050 (20560) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF8E3, 0xFAAA, 0xFC92, 0xFE79, 0xFF9E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x5060 (20576) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xEF7D, 0xDEDB, 0xBDF7, 0xA514, 0x8C71, 0x8C51, // 0x5070 (20592) pixels + 0x94B2, 0xB596, 0xCE79, 0xE71C, 0xE73C, 0xE73C, 0xE73C, 0xE71C, 0xD6BA, 0xCE59, 0xC638, 0xDEDB, 0xF7BE, 0xFFDF, 0xFFDF, 0xFFDF, // 0x5080 (20608) pixels + 0xFFDF, 0xFFDF, 0xF7BE, 0xDEFB, 0xBDD7, 0x9CD3, 0x8C51, 0x7BCF, 0x5AEB, 0x4A69, 0x4208, 0x2945, 0x0861, 0x0000, 0x0000, 0x0000, // 0x5090 (20624) pixels + 0x0861, 0x5ACB, 0xC638, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x50A0 (20640) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xE71C, 0xC638, 0xC638, 0xC638, 0xE71C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x50B0 (20656) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x50C0 (20672) pixels + 0xFFDF, 0xEF7D, 0xDEFB, 0xD69A, 0xCE59, 0xC451, 0xC082, 0xC000, 0xC041, 0xC34D, 0xC1E7, 0xC800, 0xE000, 0xF000, 0xF800, 0xF800, // 0x50D0 (20688) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x50E0 (20704) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x50F0 (20720) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5100 (20736) pixels + 0xF800, 0xF800, 0xE800, 0xB000, 0x9000, 0xB000, 0xD000, 0xE800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5110 (20752) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF000, 0xD000, 0xB000, 0x8800, 0x5000, 0x1800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x5120 (20768) pixels + 0x0000, 0x1000, 0x3800, 0x7000, 0xB000, 0xE800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5130 (20784) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xFAAA, 0xFC51, 0xFC51, // 0x5140 (20800) pixels + 0xF3EF, 0xC165, 0xC041, 0xF000, 0xF800, 0xF800, 0xF800, 0xF800, 0xF8C3, 0xFAAA, 0xFCD3, 0xFEFB, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x5150 (20816) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x5160 (20832) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x5170 (20848) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7BE, 0xF79E, 0xEF7D, 0xE71C, 0xC638, 0x94B2, 0x4208, 0x0000, // 0x5180 (20864) pixels + 0x0000, 0x0000, 0x2965, 0xB5B6, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x5190 (20880) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xD69A, 0xC638, 0xC638, 0xCE59, 0xEF5D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x51A0 (20896) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x51B0 (20912) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFEFB, 0xE9E7, 0xD800, 0xC800, 0xC2EB, 0xC28A, 0xC000, 0xC000, 0xC000, 0xC800, 0xD000, 0xE000, // 0x51C0 (20928) pixels + 0xF000, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x51D0 (20944) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x51E0 (20960) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x51F0 (20976) pixels + 0xF800, 0xF800, 0xB000, 0x1800, 0x0000, 0x0000, 0x1800, 0x4000, 0x6800, 0x8800, 0xA000, 0xC000, 0xE000, 0xF000, 0xF800, 0xF800, // 0x5200 (20992) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF000, 0xD000, 0xB000, 0x8800, 0x6800, 0x3800, 0x0800, // 0x5210 (21008) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x4800, 0x9800, 0xD800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5220 (21024) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5230 (21040) pixels + 0xA800, 0x1861, 0x1841, 0x9A08, 0xFAEB, 0xF924, 0xF820, 0xF800, 0xF800, 0xF800, 0xF800, 0xF9E7, 0xFD14, 0xFF1C, 0xFFDF, 0xFFFF, // 0x5240 (21056) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x5250 (21072) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x5260 (21088) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xE71C, 0x9492, // 0x5270 (21104) pixels + 0x3186, 0x0000, 0x0000, 0x2965, 0xB596, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x5280 (21120) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF79E, 0xCE79, 0xC638, 0xC638, 0xCE59, 0xEF5D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x5290 (21136) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x52A0 (21152) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFF9E, 0xFC10, 0xF800, 0xF800, 0xF228, 0xE3CF, 0xC800, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, // 0x52B0 (21168) pixels + 0xC000, 0xC800, 0xC800, 0xD000, 0xD800, 0xD800, 0xE000, 0xE800, 0xF000, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x52C0 (21184) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x52D0 (21200) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x52E0 (21216) pixels + 0xF800, 0xF800, 0xC000, 0x2800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x2800, 0x6800, 0xA800, 0xD000, // 0x52F0 (21232) pixels + 0xE800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xE800, 0xB800, // 0x5300 (21248) pixels + 0x7800, 0x3800, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3000, 0x8800, 0xD800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5310 (21264) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5320 (21280) pixels + 0x9800, 0x0000, 0x0000, 0x1800, 0xA2CB, 0xF430, 0xFC51, 0xFB8E, 0xF945, 0xF800, 0xF800, 0xF800, 0xF820, 0xF9C7, 0xFC71, 0xFEFB, // 0x5330 (21296) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xF7BE, 0xF7BE, 0xFFDF, 0xFFFF, // 0x5340 (21312) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x5350 (21328) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x5360 (21344) pixels + 0xD69A, 0x528A, 0x0000, 0x0000, 0x2124, 0xB596, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x5370 (21360) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF7D, 0xCE59, 0xC638, 0xC638, 0xC638, 0xDEDB, 0xF79E, 0xFFFF, 0xFFFF, 0xFFFF, // 0x5380 (21376) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x5390 (21392) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFD55, 0xF882, 0xF800, 0xF8C3, 0xFCB2, 0xF924, 0xF800, 0xE800, 0xD000, 0xC800, 0xC000, 0xC000, 0xC000, // 0x53A0 (21408) pixels + 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC800, 0xE800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x53B0 (21424) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x53C0 (21440) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x53D0 (21456) pixels + 0xF800, 0xF800, 0xF000, 0xC000, 0x8800, 0x6000, 0x3000, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, // 0x53E0 (21472) pixels + 0x3800, 0x7000, 0xB000, 0xD800, 0xF000, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x53F0 (21488) pixels + 0xF800, 0xE800, 0xC800, 0x9000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3800, 0xB000, 0xF000, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5400 (21504) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5410 (21520) pixels + 0xE000, 0x6800, 0x0000, 0x0000, 0x1000, 0x9000, 0xF000, 0xFAEB, 0xFC30, 0xFC51, 0xFA69, 0xF820, 0xF800, 0xF800, 0xF800, 0xFA28, // 0x5420 (21536) pixels + 0xFE18, 0xFFDF, 0xFFDF, 0xF7BE, 0xEF7D, 0xDEFB, 0xCE59, 0x9CD3, 0x6B6D, 0x630C, 0x630C, 0x630C, 0x5AEB, 0x5AEB, 0x738E, 0x9492, // 0x5430 (21552) pixels + 0xBDF7, 0xE73C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x5440 (21568) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x5450 (21584) pixels + 0xFFFF, 0xD6BA, 0x5ACB, 0x0000, 0x0000, 0x2945, 0xBDD7, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x5460 (21600) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF5D, 0xCE59, 0xC638, 0xC638, 0xC638, 0xC638, 0xD6BA, 0xEF7D, 0xFFFF, // 0x5470 (21616) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x5480 (21632) pixels + 0xFFFF, 0xFFFF, 0xFF9E, 0xFA8A, 0xF800, 0xF800, 0xFC10, 0xFAEB, 0xF800, 0xF800, 0xF800, 0xF800, 0xF000, 0xE000, 0xD000, 0xC800, // 0x5490 (21648) pixels + 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xD000, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x54A0 (21664) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x54B0 (21680) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x54C0 (21696) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF000, 0xE000, 0xC800, 0xA800, 0x9000, 0x7000, 0x4000, 0x1800, 0x0000, 0x0000, 0x0000, // 0x54D0 (21712) pixels + 0x0000, 0x0000, 0x0000, 0x2000, 0x5000, 0x7800, 0xA000, 0xC000, 0xD800, 0xF000, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x54E0 (21728) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xE000, 0xA800, 0x5000, 0x0800, 0x0000, 0x0000, 0x1800, 0x7800, 0xC800, 0xF800, 0xF800, 0xF800, // 0x54F0 (21744) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5500 (21760) pixels + 0xF800, 0xE800, 0x7000, 0x0000, 0x0000, 0x0800, 0x6000, 0xB000, 0xD800, 0xD861, 0xC3CF, 0xBAAA, 0xB8A2, 0x9800, 0x8800, 0x8000, // 0x5510 (21776) pixels + 0x8104, 0x838E, 0x738E, 0x52AA, 0x39E7, 0x2124, 0x0841, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x5520 (21792) pixels + 0x0841, 0x4208, 0x9CD3, 0xDEDB, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x5530 (21808) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x5540 (21824) pixels + 0xFFFF, 0xFFFF, 0xDEFB, 0x528A, 0x0000, 0x0000, 0x39E7, 0xC638, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x5550 (21840) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF7D, 0xCE79, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, 0xDEDB, // 0x5560 (21856) pixels + 0xF79E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x5570 (21872) pixels + 0xFFFF, 0xFFFF, 0xFEBA, 0xF8E3, 0xF800, 0xF945, 0xFC30, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5580 (21888) pixels + 0xF000, 0xE800, 0xE000, 0xD800, 0xD000, 0xD000, 0xC800, 0xC800, 0xC000, 0xC000, 0xD800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5590 (21904) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x55A0 (21920) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x55B0 (21936) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xE800, 0xD000, 0x9800, 0x6000, 0x3000, // 0x55C0 (21952) pixels + 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x2000, 0x4800, 0x6800, 0x9000, 0xB800, 0xD000, 0xE800, 0xF800, // 0x55D0 (21968) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xE800, 0xB800, 0x5000, 0x0000, 0x0000, 0x0000, 0x2000, 0x7800, 0xC800, 0xE800, // 0x55E0 (21984) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x55F0 (22000) pixels + 0xF800, 0xF800, 0xE000, 0x5000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1800, 0x1800, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x5600 (22016) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x5610 (22032) pixels + 0x0000, 0x0000, 0x0000, 0x2965, 0x8430, 0xDEDB, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x5620 (22048) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x5630 (22064) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xD6BA, 0x4A69, 0x0000, 0x0000, 0x39C7, 0xBDF7, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x5640 (22080) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7BE, 0xDEFB, 0xCE59, 0xC638, 0xC638, 0xC638, 0xC638, // 0x5650 (22096) pixels + 0xCE59, 0xDEFB, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x5660 (22112) pixels + 0xFFFF, 0xFFFF, 0xFDF7, 0xF820, 0xF800, 0xFAAA, 0xFB8E, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5670 (22128) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF000, 0xE800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5680 (22144) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5690 (22160) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x56A0 (22176) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF000, 0xE000, // 0x56B0 (22192) pixels + 0xC800, 0x9000, 0x5000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1800, 0x3800, 0x6000, // 0x56C0 (22208) pixels + 0x9000, 0xC000, 0xE000, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xE000, 0x8000, 0x1800, 0x0000, 0x0000, 0x0000, 0x1800, 0x4000, // 0x56D0 (22224) pixels + 0x7000, 0xA800, 0xE000, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x56E0 (22240) pixels + 0xF800, 0xF800, 0xF800, 0xD800, 0x7000, 0x1800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x56F0 (22256) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0861, 0x18E3, 0x39C7, 0x632C, 0x9CF3, 0xBDD7, 0xBDD7, 0xBDD7, 0xB5B6, 0xB5B6, 0xAD55, 0x8410, // 0x5700 (22272) pixels + 0x4208, 0x0841, 0x0000, 0x0000, 0x0000, 0x31A6, 0x94B2, 0xDEFB, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x5710 (22288) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x5720 (22304) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xD69A, 0x4A49, 0x0000, 0x0000, 0x39C7, 0xCE59, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x5730 (22320) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xE73C, 0xCE79, 0xC638, 0xC638, // 0x5740 (22336) pixels + 0xC638, 0xC638, 0xCE59, 0xD6BA, 0xE73C, 0xF79E, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x5750 (22352) pixels + 0xFFFF, 0xFFFF, 0xFCD3, 0xF800, 0xF800, 0xFBEF, 0xF9C7, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5760 (22368) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5770 (22384) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5780 (22400) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5790 (22416) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x57A0 (22432) pixels + 0xF800, 0xF800, 0xF000, 0xD800, 0xB800, 0x9800, 0x7000, 0x4800, 0x2000, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x57B0 (22448) pixels + 0x0000, 0x0800, 0x3800, 0x7000, 0xA800, 0xD800, 0xF000, 0xF800, 0xF800, 0xF000, 0xC000, 0x6800, 0x1800, 0x0000, 0x0000, 0x0000, // 0x57C0 (22464) pixels + 0x0000, 0x0000, 0x3000, 0x6000, 0xA000, 0xD000, 0xF000, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x57D0 (22480) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF000, 0xD000, 0x9000, 0x4800, 0x2000, 0x2800, 0x4000, 0x5800, 0x6000, 0x7800, 0x9000, 0x9A08, // 0x57E0 (22496) pixels + 0x9A69, 0x9800, 0xA000, 0xB882, 0xCC10, 0xDEBA, 0xEF7D, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x57F0 (22512) pixels + 0xEF5D, 0xAD75, 0x5ACB, 0x1082, 0x0000, 0x0000, 0x0000, 0x2945, 0x630C, 0x7BCF, 0x7BCF, 0x7BCF, 0x7BCF, 0x7BCF, 0x7BCF, 0x7BEF, // 0x5800 (22528) pixels + 0x9CD3, 0xC618, 0xDEDB, 0xF79E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x5810 (22544) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xD6BA, 0x4A69, 0x0000, 0x0000, 0x4A49, 0xD69A, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x5820 (22560) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xDEFB, 0xCE59, // 0x5830 (22576) pixels + 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, 0xCE59, 0xCE79, 0xD6BA, 0xDEDB, 0xDEDB, 0xDEDB, 0xDEDB, 0xDEDB, 0xDEFB, 0xDEFB, // 0x5840 (22592) pixels + 0xE73C, 0xEF3C, 0xEB2C, 0xE800, 0xF000, 0xF451, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5850 (22608) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5860 (22624) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5870 (22640) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5880 (22656) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5890 (22672) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF000, 0xD800, 0xC000, 0xA800, 0x8000, 0x5800, 0x3000, 0x1000, 0x0000, // 0x58A0 (22688) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x6000, 0x9800, 0xC800, 0xE800, 0xF800, 0xF000, 0xC000, 0x7000, 0x2800, 0x0800, // 0x58B0 (22704) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x5000, 0x9000, 0xD800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x58C0 (22720) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xE800, 0xD800, 0xE000, 0xF000, 0xF000, 0xF000, 0xF800, 0xF800, 0xF800, // 0x58D0 (22736) pixels + 0xFC92, 0xFB2C, 0xF800, 0xF800, 0xF9A6, 0xFE79, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x58E0 (22752) pixels + 0xFFFF, 0xFFFF, 0xF79E, 0xBDD7, 0x5ACB, 0x0841, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x58F0 (22768) pixels + 0x0000, 0x0841, 0x2104, 0x4A69, 0x7BEF, 0x9CD3, 0xBDD7, 0xDEFB, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x5900 (22784) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xCE79, 0x4228, 0x0000, 0x0000, 0x528A, 0xDEDB, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x5910 (22800) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7BE, // 0x5920 (22816) pixels + 0xDEFB, 0xCE59, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, // 0x5930 (22832) pixels + 0xC638, 0xC5B6, 0xC165, 0xC000, 0xC041, 0xCB4D, 0xC800, 0xD000, 0xE800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5940 (22848) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5950 (22864) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5960 (22880) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5970 (22896) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5980 (22912) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF000, 0xE000, 0xC800, 0xA800, // 0x5990 (22928) pixels + 0x7800, 0x4000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x3800, 0x6800, 0x9800, 0xC000, 0xD800, 0xD000, 0xC000, // 0x59A0 (22944) pixels + 0x9000, 0x4800, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2800, 0x7800, 0xB800, 0xE000, 0xF000, 0xF800, 0xF800, 0xF800, // 0x59B0 (22960) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x59C0 (22976) pixels + 0xF800, 0xFC92, 0xFAEB, 0xF800, 0xF800, 0xFACB, 0xFF5D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x59D0 (22992) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF7D, 0xAD75, 0x5ACB, 0x18C3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x59E0 (23008) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x2965, 0x632C, 0x9CD3, 0xBDD7, 0xCE79, 0xDEDB, 0xE73C, 0xF79E, 0xFFDF, // 0x59F0 (23024) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xCE79, 0x4208, 0x0000, 0x0000, 0x5AEB, 0xE71C, 0xFFFF, 0xFFFF, 0xFFFF, // 0x5A00 (23040) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x5A10 (23056) pixels + 0xFFFF, 0xF7BE, 0xE71C, 0xD69A, 0xCE59, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, // 0x5A20 (23072) pixels + 0xC638, 0xC575, 0xC0C3, 0xC000, 0xC0A2, 0xC30C, 0xC000, 0xC000, 0xD000, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5A30 (23088) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5A40 (23104) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5A50 (23120) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5A60 (23136) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5A70 (23152) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5A80 (23168) pixels + 0xF800, 0xE800, 0xC800, 0x9000, 0x5000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x2800, 0x6000, 0xA000, // 0x5A90 (23184) pixels + 0xD000, 0xE000, 0xC800, 0xA000, 0x6000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x3000, 0x6000, 0x8000, 0xA000, 0xA800, // 0x5AA0 (23200) pixels + 0xB800, 0xC800, 0xD000, 0xD000, 0xD800, 0xE000, 0xF000, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5AB0 (23216) pixels + 0xF800, 0xF800, 0xFC92, 0xF924, 0xF800, 0xF861, 0xFE38, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x5AC0 (23232) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF79E, 0xD69A, 0xB596, 0xA534, 0xA534, 0xA534, 0xA534, 0xA534, 0xA534, 0x9CF3, // 0x5AD0 (23248) pixels + 0x7BCF, 0x4A69, 0x2124, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x1082, 0x18E3, 0x3186, 0x528A, 0x7BCF, // 0x5AE0 (23264) pixels + 0x9CD3, 0xAD55, 0xAD55, 0xAD55, 0xAD55, 0xAD55, 0xB596, 0xCE59, 0xAD55, 0x3186, 0x0000, 0x0000, 0x6B6D, 0xE73C, 0xFFFF, 0xFFFF, // 0x5AF0 (23280) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x5B00 (23296) pixels + 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xF79E, 0xEF5D, 0xE71C, 0xDEDB, 0xD6BA, 0xD6BA, 0xD6BA, 0xD6BA, 0xD6BA, 0xD69A, 0xD69A, // 0x5B10 (23312) pixels + 0xCE79, 0xCD14, 0xC841, 0xC800, 0xC145, 0xC30C, 0xC000, 0xC000, 0xD000, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5B20 (23328) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5B30 (23344) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5B40 (23360) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5B50 (23376) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5B60 (23392) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5B70 (23408) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF000, 0xD000, 0xA800, 0x7000, 0x3800, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x5B80 (23424) pixels + 0x2800, 0x7800, 0xD000, 0xF800, 0xF000, 0xD800, 0xB000, 0x5800, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x5B90 (23440) pixels + 0x0000, 0x1000, 0x1800, 0x1800, 0x1800, 0x3000, 0x4800, 0x7000, 0x9000, 0xB800, 0xE000, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5BA0 (23456) pixels + 0xF800, 0xF800, 0xFBAE, 0xFA49, 0xF800, 0xF820, 0xFE18, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x5BB0 (23472) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x5BC0 (23488) pixels + 0xFFDF, 0xF79E, 0xDEFB, 0xBDD7, 0x94B2, 0x7BCF, 0x4A69, 0x18C3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x5BD0 (23504) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1082, 0x39C7, 0x3186, 0x0000, 0x0000, 0x0020, 0x6B4D, 0xDEDB, 0xFFFF, // 0x5BE0 (23520) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xDEFB, // 0x5BF0 (23536) pixels + 0xCE59, 0xD69A, 0xEF5D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x5C00 (23552) pixels + 0xFFDF, 0xFDF7, 0xF820, 0xF000, 0xF269, 0xEB2C, 0xE000, 0xE000, 0xF000, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5C10 (23568) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5C20 (23584) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5C30 (23600) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5C40 (23616) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5C50 (23632) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5C60 (23648) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xE800, 0xC800, 0xA000, 0x7800, 0x4800, 0x1800, 0x0000, 0x0000, // 0x5C70 (23664) pixels + 0x0000, 0x0000, 0x2800, 0x8800, 0xD800, 0xF800, 0xF800, 0xF000, 0xC800, 0x8800, 0x4000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x5C80 (23680) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3800, 0x9000, 0xD000, 0xF000, 0xF800, 0xF800, // 0x5C90 (23696) pixels + 0xF800, 0xF800, 0xFBCF, 0xF9C7, 0xF800, 0xF8A2, 0xFE9A, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x5CA0 (23712) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x5CB0 (23728) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF79E, 0xD69A, 0xAD55, 0x7BEF, 0x5ACB, 0x4208, 0x2965, 0x18C3, 0x0020, 0x0000, // 0x5CC0 (23744) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x52AA, 0xEF5D, // 0x5CD0 (23760) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7BE, 0xCE79, // 0x5CE0 (23776) pixels + 0xC638, 0xC638, 0xC638, 0xDEDB, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x5CF0 (23792) pixels + 0xFFFF, 0xFDF7, 0xF820, 0xF800, 0xFACB, 0xFB2C, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5D00 (23808) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5D10 (23824) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5D20 (23840) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5D30 (23856) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5D40 (23872) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5D50 (23888) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xE800, 0xD000, 0xA041, 0x59E7, // 0x5D60 (23904) pixels + 0x1041, 0x0000, 0x0000, 0x0000, 0x3000, 0x8800, 0xC800, 0xF000, 0xF800, 0xF800, 0xE800, 0xC800, 0xB000, 0x9800, 0x7800, 0x7000, // 0x5D70 (23920) pixels + 0x5800, 0x4000, 0x3000, 0x3000, 0x3000, 0x1800, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x6000, 0xA800, 0xD000, // 0x5D80 (23936) pixels + 0xE800, 0xF800, 0xFC71, 0xF8A2, 0xF800, 0xF9A6, 0xFF3C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x5D90 (23952) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x5DA0 (23968) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7BE, 0xEF7D, 0xE73C, 0xD6BA, 0xBDF7, 0xA514, // 0x5DB0 (23984) pixels + 0x8430, 0x73AE, 0x73AE, 0x73AE, 0x73AE, 0x73AE, 0x630C, 0x39C7, 0x1082, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2965, 0xDEFB, // 0x5DC0 (24000) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xDEFB, // 0x5DD0 (24016) pixels + 0xC638, 0xC638, 0xC638, 0xC638, 0xCE59, 0xDEDB, 0xEF5D, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x5DE0 (24032) pixels + 0xFFFF, 0xFD34, 0xF800, 0xF800, 0xFB8E, 0xFA8A, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5DF0 (24048) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5E00 (24064) pixels + 0xF8E3, 0xFACB, 0xFBEF, 0xFBEF, 0xFBEF, 0xFBEF, 0xFBCF, 0xF986, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5E10 (24080) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5E20 (24096) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5E30 (24112) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5E40 (24128) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xFB4D, 0xFC71, 0xFC51, 0xF2AA, // 0x5E50 (24144) pixels + 0xC082, 0x6000, 0x0800, 0x0000, 0x0000, 0x0000, 0x1800, 0x5000, 0x9800, 0xD000, 0xF000, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5E60 (24160) pixels + 0xF000, 0xE800, 0xE800, 0xE800, 0xE000, 0xD000, 0xC000, 0xA000, 0x8000, 0x4800, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x1800, // 0x5E70 (24176) pixels + 0x4800, 0x8000, 0xBAEB, 0xE000, 0xF800, 0xFAEB, 0xFFBE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x5E80 (24192) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x5E90 (24208) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x5EA0 (24224) pixels + 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xEF5D, 0xCE59, 0xA514, 0x73AE, 0x52AA, 0x4A49, 0x52AA, 0xA534, 0xF7BE, // 0x5EB0 (24240) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x5EC0 (24256) pixels + 0xEF5D, 0xCE79, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, 0xCE59, 0xDEDB, 0xEF7D, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x5ED0 (24272) pixels + 0xFFFF, 0xFC30, 0xF800, 0xF800, 0xFC51, 0xF841, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5EE0 (24288) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF882, 0xFBEF, 0xFC30, 0xFC30, // 0x5EF0 (24304) pixels + 0xFC51, 0xFB4D, 0xFA08, 0xF965, 0xF965, 0xF986, 0xFA8A, 0xFC30, 0xFC71, 0xFB4D, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5F00 (24320) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5F10 (24336) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5F20 (24352) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5F30 (24368) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xFB0C, 0xFC92, 0xFB6D, 0xF8E3, 0xF800, 0xF800, // 0x5F40 (24384) pixels + 0xF800, 0xF000, 0xB000, 0x5000, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x1800, 0x5800, 0xA800, 0xE000, 0xF800, 0xF800, 0xF800, // 0x5F50 (24400) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xE800, 0xB000, 0x6000, 0x2000, 0x0000, 0x0000, 0x0000, // 0x5F60 (24416) pixels + 0x0000, 0x0000, 0x0800, 0x4000, 0xA000, 0xF451, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x5F70 (24432) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x5F80 (24448) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x5F90 (24464) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xF7BE, 0xF79E, 0xF7BE, 0xFFFF, 0xFFFF, // 0x5FA0 (24480) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x5FB0 (24496) pixels + 0xFFFF, 0xFFDF, 0xDEFB, 0xCE59, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, 0xCE59, 0xD69A, 0xDEFB, 0xEF7D, 0xFFDF, 0xFFFF, // 0x5FC0 (24512) pixels + 0xFFBE, 0xFAEB, 0xF800, 0xF800, 0xFC71, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5FD0 (24528) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xFBEF, 0xFC92, 0xFAAA, 0xF904, 0xF820, // 0x5FE0 (24544) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF8C3, 0xFBCF, 0xFC51, 0xF8A2, 0xF800, 0xF800, 0xF800, 0xF800, // 0x5FF0 (24560) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x6000 (24576) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x6010 (24592) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x6020 (24608) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xFA49, 0xFC71, 0xFBCF, 0xF8E3, 0xF800, 0xF800, 0xF800, 0xF800, // 0x6030 (24624) pixels + 0xF8C3, 0xF945, 0xF8A2, 0xE820, 0xB800, 0x7000, 0x2800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x9800, 0xE000, 0xF800, // 0x6040 (24640) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF000, 0xD000, 0x9800, 0x5800, 0x2800, // 0x6050 (24656) pixels + 0x0800, 0x0000, 0x0000, 0x0000, 0x1000, 0x838E, 0xEF5D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6060 (24672) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6070 (24688) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6080 (24704) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6090 (24720) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x60A0 (24736) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xF79E, 0xDEFB, 0xCE79, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, 0xCE79, 0xDEFB, // 0x60B0 (24752) pixels + 0xEEDB, 0xF1C7, 0xF000, 0xF082, 0xF410, 0xF000, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x60C0 (24768) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xFC92, 0xFB0C, 0xF841, 0xF800, 0xF800, 0xF800, // 0x60D0 (24784) pixels + 0xF800, 0xF800, 0xE000, 0xB000, 0x8800, 0x8000, 0xA800, 0xE800, 0xF800, 0xF800, 0xFA69, 0xFCD3, 0xF9E7, 0xF800, 0xF800, 0xF800, // 0x60E0 (24800) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x60F0 (24816) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x6100 (24832) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x6110 (24848) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF9C7, 0xFC51, 0xFC10, 0xF965, 0xF800, 0xF800, 0xF800, 0xF904, 0xFB4D, 0xFD55, // 0x6120 (24864) pixels + 0xFEBA, 0xFF1C, 0xFEBA, 0xFDB6, 0xFC30, 0xFA8A, 0xD904, 0xA800, 0x6800, 0x2800, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0xA000, // 0x6130 (24880) pixels + 0xE800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF000, 0xE34D, // 0x6140 (24896) pixels + 0xBA8A, 0x8800, 0x4000, 0x0000, 0x0000, 0x0020, 0x6B4D, 0xD6BA, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6150 (24912) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6160 (24928) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6170 (24944) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6180 (24960) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6190 (24976) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF79E, 0xE71C, 0xCE79, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, 0xC638, // 0x61A0 (24992) pixels + 0xC555, 0xC0C3, 0xC000, 0xC0E3, 0xC30C, 0xC000, 0xC800, 0xC800, 0xC800, 0xC800, 0xD000, 0xD800, 0xE800, 0xF000, 0xF800, 0xF800, // 0x61B0 (25008) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xFC10, 0xFAEB, 0xF800, 0xF800, 0xF800, 0xF904, 0xF9E7, // 0x61C0 (25024) pixels + 0xF2CB, 0x99E7, 0x3861, 0x0000, 0x0000, 0x0000, 0x0000, 0x6020, 0xD841, 0xF800, 0xF800, 0xF965, 0xFC71, 0xFB4D, 0xF800, 0xF800, // 0x61D0 (25040) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x61E0 (25056) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x61F0 (25072) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x6200 (25088) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xFBEF, 0xFC71, 0xF9C7, 0xF800, 0xF800, 0xF800, 0xF8E3, 0xFBCF, 0xFE79, 0xFFBE, 0xFFFF, // 0x6210 (25104) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFF9E, 0xFEBA, 0xFCB2, 0xF2CB, 0xD945, 0x9800, 0x4000, 0x0000, 0x0000, 0x0000, 0x0800, // 0x6220 (25120) pixels + 0x5000, 0xB800, 0xF000, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xFB6D, 0xFBCF, // 0x6230 (25136) pixels + 0xF841, 0xF800, 0xE841, 0x9249, 0x18C3, 0x0000, 0x0000, 0x4208, 0xC618, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6240 (25152) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6250 (25168) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6260 (25184) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6270 (25200) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6280 (25216) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xF79E, 0xE73C, 0xDEDB, 0xCE79, 0xC638, 0xC638, 0xC638, // 0x6290 (25232) pixels + 0xC534, 0xC061, 0xC000, 0xC145, 0xC2CB, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC800, 0xD000, 0xD800, // 0x62A0 (25248) pixels + 0xE000, 0xE000, 0xE000, 0xE000, 0xE800, 0xF000, 0xF000, 0xF000, 0xF208, 0xF430, 0xF020, 0xF000, 0xF104, 0xF471, 0xFEBA, 0xF71C, // 0x62B0 (25264) pixels + 0x8C30, 0x0861, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7165, 0xF165, 0xF800, 0xF800, 0xF882, 0xFBAE, 0xFC51, 0xF800, // 0x62C0 (25280) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x62D0 (25296) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x62E0 (25312) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x62F0 (25328) pixels + 0xF800, 0xF800, 0xF800, 0xFA49, 0xFCB2, 0xFACB, 0xF841, 0xF800, 0xF800, 0xF882, 0xFB0C, 0xFE18, 0xFFBE, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6300 (25344) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFBE, 0xFEFB, 0xFD55, 0xEA49, 0xA020, 0x4800, 0x0000, 0x0000, // 0x6310 (25360) pixels + 0x0000, 0x1800, 0x8000, 0xE000, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xFCB2, 0xF861, // 0x6320 (25376) pixels + 0xF800, 0xF820, 0xFBEF, 0xF73C, 0xA534, 0x2965, 0x0000, 0x0000, 0x31A6, 0xC618, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6330 (25392) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6340 (25408) pixels + 0xFFDF, 0xFFDF, 0xF79E, 0xEF5D, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6350 (25424) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6360 (25440) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6370 (25456) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xEF7D, 0xDEFB, 0xCE79, // 0x6380 (25472) pixels + 0xCD34, 0xC061, 0xC000, 0xC165, 0xC2CB, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, // 0x6390 (25488) pixels + 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC36D, 0xC104, 0xC000, 0xC041, 0xC410, 0xCE38, 0xC638, 0x8410, // 0x63A0 (25504) pixels + 0x0841, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1082, 0xBC10, 0xFA69, 0xF800, 0xF800, 0xF800, 0xFB4D, 0xFBEF, // 0x63B0 (25520) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x63C0 (25536) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x63D0 (25552) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x63E0 (25568) pixels + 0xF800, 0xF800, 0xFB4D, 0xFC71, 0xF965, 0xF800, 0xF800, 0xF820, 0xFAAA, 0xFDB6, 0xFF9E, 0xFFFF, 0xFFFF, 0xF7BE, 0xE73C, 0xDEDB, // 0x63F0 (25584) pixels + 0xD69A, 0xBDF7, 0xB5B6, 0xC638, 0xDEFB, 0xEF7D, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFF3C, 0xFC10, 0xE000, 0x9800, 0x3800, // 0x6400 (25600) pixels + 0x0000, 0x0000, 0x0000, 0x5000, 0xC000, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xFA69, 0xFBEF, 0xF800, // 0x6410 (25616) pixels + 0xF800, 0xFB4D, 0xFF7D, 0xFFFF, 0xFFDF, 0xC638, 0x4A49, 0x0000, 0x0000, 0x3186, 0xAD55, 0xF79E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6420 (25632) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7BE, 0xE73C, 0xCE79, 0xAD75, 0x8430, // 0x6430 (25648) pixels + 0x6B6D, 0x630C, 0x4A49, 0x39E7, 0x52AA, 0x7BCF, 0x94B2, 0xB5B6, 0xE71C, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6440 (25664) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6450 (25680) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6460 (25696) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6470 (25712) pixels + 0xF679, 0xF082, 0xF000, 0xF1C7, 0xF36D, 0xF000, 0xE800, 0xE000, 0xE000, 0xE000, 0xD800, 0xD000, 0xC800, 0xC000, 0xC000, 0xC000, // 0x6480 (25728) pixels + 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC0A2, 0xC34D, 0xC000, 0xC000, 0xC228, 0xC5D7, 0xC618, 0x7BCF, 0x0020, // 0x6490 (25744) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630C, 0xF69A, 0xFC30, 0xF8C3, 0xF800, 0xF841, 0xFBEF, // 0x64A0 (25760) pixels + 0xFB2C, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x64B0 (25776) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x64C0 (25792) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x64D0 (25808) pixels + 0xF800, 0xFBEF, 0xFBEF, 0xF8A2, 0xF800, 0xF800, 0xF9C7, 0xFD14, 0xFF5D, 0xFFFF, 0xFFDF, 0xD69A, 0x8C71, 0x5ACB, 0x3186, 0x18C3, // 0x64E0 (25824) pixels + 0x1082, 0x0020, 0x0000, 0x0861, 0x2104, 0x4228, 0x73AE, 0xBDF7, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFD55, 0xF800, 0xF800, 0xDA8A, // 0x64F0 (25840) pixels + 0x7965, 0x1800, 0x0000, 0x0000, 0x2800, 0xA000, 0xF000, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xFB0C, 0xFB8E, 0xF800, // 0x6500 (25856) pixels + 0xF800, 0xFD55, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xD6BA, 0x528A, 0x0000, 0x0000, 0x1082, 0x632C, 0xB596, 0xCE79, 0xDEFB, 0xEF5D, // 0x6510 (25872) pixels + 0xEF5D, 0xEF5D, 0xEF5D, 0xE73C, 0xD6BA, 0xC638, 0xC638, 0xC638, 0xC638, 0xC618, 0xA534, 0x6B4D, 0x3186, 0x1082, 0x0000, 0x0000, // 0x6520 (25888) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x31A6, 0x8430, 0xCE79, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6530 (25904) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6540 (25920) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6550 (25936) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6560 (25952) pixels + 0xFEBA, 0xF8A2, 0xF800, 0xF9C7, 0xFBAE, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF000, 0xE800, 0xD800, 0xD000, // 0x6570 (25968) pixels + 0xC800, 0xC800, 0xC800, 0xC800, 0xC800, 0xC000, 0xC000, 0xC2CB, 0xC1E7, 0xC000, 0xC000, 0xC430, 0xC638, 0x9CD3, 0x18C3, 0x0000, // 0x6580 (25984) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x18E3, 0xD69A, 0xFFDF, 0xFCF3, 0xF861, 0xF800, 0xF882, // 0x6590 (26000) pixels + 0xFC71, 0xFA69, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x65A0 (26016) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x65B0 (26032) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x65C0 (26048) pixels + 0xFB4D, 0xFBEF, 0xF820, 0xF800, 0xF841, 0xFB4D, 0xFEBA, 0xEF5D, 0xC638, 0xA534, 0x6B6D, 0x10A2, 0x0000, 0x0000, 0x0000, 0x0000, // 0x65D0 (26064) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1082, 0x9CF3, 0xFFDF, 0xFFFF, 0xFFFF, 0xFC30, 0xF800, 0xF800, 0xFC10, // 0x65E0 (26080) pixels + 0xF104, 0xB000, 0x4000, 0x0000, 0x0000, 0x1000, 0x8800, 0xE800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF9A6, 0xFBEF, 0xF800, // 0x65F0 (26096) pixels + 0xF800, 0xFD14, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xDEDB, 0x630C, 0x0020, 0x0000, 0x0000, 0x0000, 0x0861, 0x2124, 0x31A6, // 0x6600 (26112) pixels + 0x31A6, 0x31A6, 0x31A6, 0x2965, 0x18C3, 0x0841, 0x0841, 0x0841, 0x0841, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x6610 (26128) pixels + 0x0000, 0x0000, 0x0841, 0x1082, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2104, 0x8C71, 0xF79E, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6620 (26144) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6630 (26160) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6640 (26176) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6650 (26192) pixels + 0xFE9A, 0xF861, 0xF800, 0xF8C3, 0xFC10, 0xFC51, 0xFC51, 0xFC10, 0xFA69, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x6660 (26208) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF000, 0xF000, 0xF000, 0xF451, 0xF061, 0xF000, 0xF186, 0xE659, 0x9CF3, 0x2945, 0x0000, 0x0000, // 0x6670 (26224) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7BEF, 0xF7BE, 0xFF9E, 0xFBCF, 0xF800, 0xF800, // 0x6680 (26240) pixels + 0xF986, 0xFC51, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x6690 (26256) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x66A0 (26272) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF986, // 0x66B0 (26288) pixels + 0xFC92, 0xF8A2, 0xF800, 0xF882, 0xFC51, 0xEEBA, 0xA534, 0x4A49, 0x0861, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x66C0 (26304) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4A49, 0xEF7D, 0xFFFF, 0xFF3C, 0xF9C7, 0xF800, 0xF800, 0xFC51, // 0x66D0 (26320) pixels + 0xF800, 0xF800, 0xD800, 0x6800, 0x0000, 0x0000, 0x0800, 0x7000, 0xE000, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xFC30, 0xF800, // 0x66E0 (26336) pixels + 0xF800, 0xFC92, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xE73C, 0x8C71, 0x2945, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x66F0 (26352) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x10A2, 0x39E7, 0x632C, 0x9492, // 0x6700 (26368) pixels + 0xAD75, 0xB5B6, 0xC638, 0xD69A, 0xBDF7, 0xA534, 0x8430, 0x4A69, 0x0861, 0x0000, 0x0000, 0x10A2, 0xC618, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6710 (26384) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6720 (26400) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6730 (26416) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6740 (26432) pixels + 0xFE59, 0xF841, 0xF800, 0xF800, 0xF800, 0xF820, 0xF8A2, 0xF9E7, 0xFBEF, 0xFC51, 0xFC51, 0xFA28, 0xF800, 0xF800, 0xF800, 0xF800, // 0x6750 (26448) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xFA8A, 0xFBCF, 0xF800, 0xF800, 0xE2EB, 0x7B8E, 0x1082, 0x0000, 0x0000, 0x0000, // 0x6760 (26464) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0841, 0x9CF3, 0xFFFF, 0xFF1C, 0xF9E7, 0xF800, // 0x6770 (26480) pixels + 0xF841, 0xFC51, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x6780 (26496) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x6790 (26512) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xFC92, // 0x67A0 (26528) pixels + 0xF9E7, 0xF800, 0xF820, 0xFC10, 0xCDF7, 0x528A, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x67B0 (26544) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2104, 0xBDD7, 0xFFFF, 0xFD34, 0xF820, 0xF800, 0xF9C7, 0xFC30, // 0x67C0 (26560) pixels + 0xF800, 0xF800, 0xF800, 0xE800, 0x8800, 0x1000, 0x0000, 0x0000, 0x6000, 0xD000, 0xF800, 0xF800, 0xF800, 0xFB6D, 0xFAEB, 0xF800, // 0x67D0 (26576) pixels + 0xF800, 0xFD14, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xD69A, 0x8C71, 0x5AEB, 0x4208, 0x2124, 0x18C3, // 0x67E0 (26592) pixels + 0x18C3, 0x18C3, 0x18C3, 0x18E3, 0x3186, 0x4A49, 0x528A, 0x528A, 0x528A, 0x52AA, 0x6B4D, 0x9CF3, 0xD69A, 0xEF7D, 0xFFDF, 0xFFFF, // 0x67F0 (26608) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7BE, 0xB5B6, 0x39C7, 0x0000, 0x0000, 0x10A2, 0xC638, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6800 (26624) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6810 (26640) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6820 (26656) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6830 (26672) pixels + 0xFF5D, 0xFAEB, 0xF820, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF820, 0xF986, 0xFC10, 0xFC51, 0xFC10, 0xFB6D, 0xFBAE, // 0x6840 (26688) pixels + 0xFB6D, 0xFB2C, 0xF965, 0xF800, 0xF800, 0xF800, 0xFC10, 0xF9C7, 0xF800, 0xE841, 0x6165, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x6850 (26704) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x39E7, 0xE73C, 0xFFDF, 0xFB8E, 0xF800, // 0x6860 (26720) pixels + 0xF800, 0xFC51, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x6870 (26736) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x6880 (26752) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xFB2C, 0xFBAE, // 0x6890 (26768) pixels + 0xF800, 0xF800, 0xFAAA, 0xDDD7, 0x4208, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x68A0 (26784) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x528A, 0xEF3C, 0xFB2C, 0xF800, 0xF800, 0xFC10, 0xF9A6, // 0x68B0 (26800) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF000, 0xA000, 0x2000, 0x0000, 0x0000, 0x2800, 0x8800, 0xD800, 0xF800, 0xFC71, 0xF904, 0xF800, // 0x68C0 (26816) pixels + 0xF8E3, 0xFE9A, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7BE, 0xEF7D, 0xDEFB, 0xDEDB, // 0x68D0 (26832) pixels + 0xD6BA, 0xD6BA, 0xD6BA, 0xDEDB, 0xE73C, 0xF79E, 0xF7BE, 0xF7BE, 0xF7BE, 0xF7BE, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x68E0 (26848) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF7D, 0xBDD7, 0x6B6D, 0x18E3, 0x0000, 0x0000, 0x0020, 0x7BEF, 0xF79E, 0xFFFF, 0xFFFF, 0xFFFF, // 0x68F0 (26864) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6900 (26880) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6910 (26896) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6920 (26912) pixels + 0xFFFF, 0xFF5D, 0xFDF7, 0xFD14, 0xFBCF, 0xFA8A, 0xF9A6, 0xF861, 0xF800, 0xF800, 0xF800, 0xF800, 0xF8A2, 0xF9A6, 0xFA49, 0xFA49, // 0x6930 (26928) pixels + 0xFA69, 0xFB0C, 0xFC10, 0xFC71, 0xFC51, 0xFC30, 0xFC51, 0xF841, 0xF800, 0xB861, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x6940 (26944) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x10A2, 0xD69A, 0xFFFF, 0xFCF3, 0xF800, // 0x6950 (26960) pixels + 0xF800, 0xFBCF, 0xFA69, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x6960 (26976) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x6970 (26992) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xFC92, 0xF8C3, // 0x6980 (27008) pixels + 0xF800, 0xF904, 0xFE18, 0x9492, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x6990 (27024) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5AEB, 0xF69A, 0xF965, 0xF800, 0xF8A2, 0xFC51, 0xF800, // 0x69A0 (27040) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xB000, 0x3000, 0x0000, 0x0000, 0x0000, 0x3000, 0x98A2, 0xEBAE, 0xF800, 0xF800, // 0x69B0 (27056) pixels + 0xFB0C, 0xFF9E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x69C0 (27072) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x69D0 (27088) pixels + 0xFFFF, 0xFFFF, 0xFFDF, 0xC638, 0x5AEB, 0x0861, 0x0000, 0x0000, 0x0000, 0x2104, 0x8430, 0xEF5D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x69E0 (27104) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x69F0 (27120) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6A00 (27136) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6A10 (27152) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFF9E, 0xFF3C, 0xFE38, 0xFC92, 0xFA8A, 0xF861, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x6A20 (27168) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF820, 0xF8A2, 0xF8A2, 0xF800, 0xF800, 0x9124, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x6A30 (27184) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0861, 0xCE79, 0xFFFF, 0xFDD7, 0xF820, // 0x6A40 (27200) pixels + 0xF800, 0xFAAA, 0xFC92, 0xFBEF, 0xFBEF, 0xFBEF, 0xFBEF, 0xFBEF, 0xFBEF, 0xFC10, 0xFB6D, 0xF841, 0xF800, 0xF800, 0xF800, 0xF800, // 0x6A50 (27216) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x6A60 (27232) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xFACB, 0xFBAE, 0xF800, // 0x6A70 (27248) pixels + 0xF800, 0xFBCF, 0xFF9E, 0x6B6D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x6A80 (27264) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x18C3, 0xCE59, 0xFEBA, 0xF8C3, 0xF800, 0xF8E3, 0xFC71, 0xFA8A, // 0x6A90 (27280) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xC800, 0x6000, 0x1000, 0x0000, 0x0000, 0x0820, 0x6041, 0xC800, 0xF820, // 0x6AA0 (27296) pixels + 0xFD75, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6AB0 (27312) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6AC0 (27328) pixels + 0xFFFF, 0xFFFF, 0xC618, 0x3186, 0x0000, 0x0000, 0x0000, 0x2104, 0x73AE, 0xCE79, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6AD0 (27344) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6AE0 (27360) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6AF0 (27376) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6B00 (27392) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFF7D, 0xFDD7, 0xFB8E, 0xF9A6, 0xF8A2, 0xF841, 0xF820, // 0x6B10 (27408) pixels + 0xF820, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF945, 0x8269, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x6B20 (27424) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x18C3, 0xDEDB, 0xFFFF, 0xFE38, 0xF882, // 0x6B30 (27440) pixels + 0xF800, 0xF841, 0xF8E3, 0xF8E3, 0xF8E3, 0xF8E3, 0xF8E3, 0xF8E3, 0xF924, 0xF9C7, 0xFAEB, 0xFC51, 0xFC51, 0xFBAE, 0xFAEB, 0xFA69, // 0x6B40 (27456) pixels + 0xF8C3, 0xF8A2, 0xF8A2, 0xF8A2, 0xF8A2, 0xF8A2, 0xF8A2, 0xF8A2, 0xF8A2, 0xFAAA, 0xFB8E, 0xFB4D, 0xFAEB, 0xFAEB, 0xFB8E, 0xFB6D, // 0x6B50 (27472) pixels + 0xFB8E, 0xFB8E, 0xFB8E, 0xFB8E, 0xFB8E, 0xFB8E, 0xFB8E, 0xFB8E, 0xFBAE, 0xFB8E, 0xFAEB, 0xFB6D, 0xFBAE, 0xFCB2, 0xF9C7, 0xF800, // 0x6B60 (27488) pixels + 0xF841, 0xFE38, 0xF7BE, 0x52AA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x6B70 (27504) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x31A6, 0xEF7D, 0xFEFB, 0xF904, 0xF800, 0xF800, 0xFA08, 0xFBCF, // 0x6B80 (27520) pixels + 0xFC71, 0xFC51, 0xFC30, 0xFC51, 0xFB8E, 0xF945, 0xF800, 0xF800, 0xF000, 0xB800, 0x5820, 0x0820, 0x0000, 0x0000, 0x2000, 0x78E3, // 0x6B90 (27536) pixels + 0xD5F7, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6BA0 (27552) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6BB0 (27568) pixels + 0xFFFF, 0xF79E, 0x5AEB, 0x0000, 0x0000, 0x2965, 0x8C51, 0xCE79, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6BC0 (27584) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6BD0 (27600) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6BE0 (27616) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6BF0 (27632) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFF3C, 0xFE9A, 0xFE59, 0xFE38, // 0x6C00 (27648) pixels + 0xFE38, 0xFDB6, 0xFCD3, 0xFBEF, 0xFACB, 0xF986, 0xF8E3, 0xFA28, 0xFD34, 0x6B2C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x6C10 (27664) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x18C3, 0xD6BA, 0xFFFF, 0xFF5D, 0xFB6D, // 0x6C20 (27680) pixels + 0xF8C3, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF8E3, 0xFA69, 0xFB4D, 0xFBCF, // 0x6C30 (27696) pixels + 0xFC10, 0xFC10, 0xFC10, 0xFC10, 0xFC10, 0xFC10, 0xFC10, 0xFC10, 0xFC10, 0xFB8E, 0xFAEB, 0xFB0C, 0xFB8E, 0xFB4D, 0xFAAA, 0xFA28, // 0x6C40 (27712) pixels + 0xFA08, 0xFA08, 0xFA08, 0xFA08, 0xFA08, 0xFA08, 0xFA08, 0xF9E7, 0xF9E7, 0xFA8A, 0xFB6D, 0xFAEB, 0xF9E7, 0xF904, 0xF800, 0xF800, // 0x6C50 (27728) pixels + 0xF841, 0xFE79, 0xF7BE, 0x630C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x6C60 (27744) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4228, 0xF79E, 0xFF5D, 0xFA28, 0xF800, 0xF800, 0xF800, 0xF800, // 0x6C70 (27760) pixels + 0xF800, 0xF820, 0xF861, 0xF904, 0xFAAA, 0xFC51, 0xFC30, 0xFC10, 0xFC10, 0xFC30, 0xEB6D, 0xA0A2, 0x2800, 0x0000, 0x0000, 0x0000, // 0x6C80 (27776) pixels + 0x2124, 0x7BEF, 0xD69A, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6C90 (27792) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6CA0 (27808) pixels + 0xFFFF, 0xC618, 0x10A2, 0x0000, 0x2945, 0xCE59, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6CB0 (27824) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6CC0 (27840) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6CD0 (27856) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6CE0 (27872) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6CF0 (27888) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFBE, 0xFF3C, 0xFEBA, 0xFF3C, 0xFFBE, 0x632C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x6D00 (27904) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xAD55, 0xFFFF, 0xFFFF, 0xFF5D, // 0x6D10 (27920) pixels + 0xFD75, 0xFA8A, 0xF965, 0xF965, 0xF965, 0xF965, 0xF965, 0xF965, 0xF945, 0xF8A2, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x6D20 (27936) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x6D30 (27952) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, // 0x6D40 (27968) pixels + 0xF800, 0xFDD7, 0xFFFF, 0x8C51, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x6D50 (27984) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6B6D, 0xFFDF, 0xFFDF, 0xFD55, 0xF945, 0xF820, 0xF800, 0xF800, // 0x6D60 (28000) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF820, 0xF800, 0xF800, 0xF800, 0xC800, 0x6861, 0x1061, 0x0000, // 0x6D70 (28016) pixels + 0x0000, 0x0000, 0x2945, 0x8410, 0xD69A, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6D80 (28032) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6D90 (28048) pixels + 0xF7BE, 0x6B6D, 0x0000, 0x0000, 0x7BEF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6DA0 (28064) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6DB0 (28080) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6DC0 (28096) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6DD0 (28112) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6DE0 (28128) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0x632C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x6DF0 (28144) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9CD3, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6E00 (28160) pixels + 0xFFFF, 0xFF7D, 0xFF3C, 0xFF3C, 0xFF3C, 0xFF3C, 0xFF3C, 0xFF3C, 0xFF1C, 0xFE9A, 0xFD55, 0xFB2C, 0xF945, 0xF841, 0xF800, 0xF800, // 0x6E10 (28176) pixels + 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF820, 0xF800, 0xF800, 0xF800, 0xF820, 0xF861, // 0x6E20 (28192) pixels + 0xF882, 0xF882, 0xF882, 0xF882, 0xF882, 0xF882, 0xF882, 0xF861, 0xF861, 0xF820, 0xF800, 0xF800, 0xF841, 0xF8E3, 0xF8C3, 0xF800, // 0x6E30 (28208) pixels + 0xF9E7, 0xFEFB, 0xFFFF, 0xB5B6, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x6E40 (28224) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8430, 0xFFFF, 0xFFFF, 0xFFDF, 0xFEFB, 0xFE18, 0xFDD7, 0xFD14, // 0x6E50 (28240) pixels + 0xFB8E, 0xFA49, 0xF9C7, 0xF8E3, 0xF820, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xFA49, 0xF5D7, 0xC5F7, 0x6B4D, // 0x6E60 (28256) pixels + 0x10A2, 0x0000, 0x0000, 0x0000, 0x2124, 0x738E, 0xBDF7, 0xEF5D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6E70 (28272) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6E80 (28288) pixels + 0xBDD7, 0x10A2, 0x0000, 0x2124, 0xCE79, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6E90 (28304) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6EA0 (28320) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6EB0 (28336) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6EC0 (28352) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6ED0 (28368) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x7BCF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x6EE0 (28384) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9CD3, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6EF0 (28400) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFBE, 0xFEFB, 0xFE38, 0xFD96, 0xFD34, // 0x6F00 (28416) pixels + 0xFD14, 0xFD14, 0xFD14, 0xFD14, 0xFD14, 0xFD14, 0xFD14, 0xFD14, 0xFD14, 0xFD55, 0xFDD7, 0xFD96, 0xFD34, 0xFD96, 0xFE18, 0xFE79, // 0x6F10 (28432) pixels + 0xFE9A, 0xFE9A, 0xFE9A, 0xFE9A, 0xFE9A, 0xFE9A, 0xFE9A, 0xFE79, 0xFE79, 0xFDF7, 0xFD55, 0xFD75, 0xFE59, 0xFEDB, 0xFEDB, 0xFDF7, // 0x6F20 (28448) pixels + 0xFEDB, 0xFFFF, 0xFFFF, 0xDEDB, 0x18E3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x6F30 (28464) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xAD55, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6F40 (28480) pixels + 0xFFDF, 0xFF9E, 0xFF7D, 0xFEDB, 0xFDB6, 0xFC71, 0xFB6D, 0xFB0C, 0xFB0C, 0xFB0C, 0xFBAE, 0xFD55, 0xFF1C, 0xFFFF, 0xFFFF, 0xF7BE, // 0x6F50 (28496) pixels + 0xC618, 0x632C, 0x10A2, 0x0000, 0x0000, 0x0000, 0x0861, 0x4228, 0x8C71, 0xC638, 0xEF5D, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6F60 (28512) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xD6BA, // 0x6F70 (28528) pixels + 0x4228, 0x0000, 0x0000, 0x8410, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6F80 (28544) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6F90 (28560) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6FA0 (28576) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6FB0 (28592) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6FC0 (28608) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0x738E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x6FD0 (28624) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xAD55, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6FE0 (28640) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x6FF0 (28656) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7000 (28672) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7010 (28688) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xEF7D, 0x4208, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x7020 (28704) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x18C3, 0xD6BA, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7030 (28720) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7040 (28736) pixels + 0xFFFF, 0xF79E, 0xBDF7, 0x6B4D, 0x18E3, 0x0000, 0x0000, 0x0000, 0x0000, 0x1082, 0x39E7, 0x6B4D, 0x8C71, 0xA534, 0xBDD7, 0xCE59, // 0x7050 (28752) pixels + 0xD6BA, 0xDEFB, 0xE73C, 0xEF7D, 0xF79E, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF79E, 0xC618, 0x4A49, // 0x7060 (28768) pixels + 0x0000, 0x0000, 0x4228, 0xDEFB, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7070 (28784) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7080 (28800) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7090 (28816) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x70A0 (28832) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x70B0 (28848) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7BE, 0x52AA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x70C0 (28864) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3186, 0xDEDB, 0xFFFF, 0xFFFF, 0xFFFF, // 0x70D0 (28880) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x70E0 (28896) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x70F0 (28912) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7100 (28928) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0x7BEF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x7110 (28944) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4A69, 0xF79E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7120 (28960) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7130 (28976) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xF7BE, 0xCE59, 0x8430, 0x39E7, 0x0841, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0841, // 0x7140 (28992) pixels + 0x10A2, 0x2104, 0x2965, 0x39E7, 0x4A69, 0x632C, 0x7BCF, 0x8C71, 0x9CF3, 0xAD55, 0xB5B6, 0xB5B6, 0x9492, 0x528A, 0x10A2, 0x0000, // 0x7150 (29008) pixels + 0x0000, 0x31A6, 0xC618, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7160 (29024) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7170 (29040) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7180 (29056) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7190 (29072) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x71A0 (29088) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF7D, 0x4A69, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x71B0 (29104) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9CF3, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x71C0 (29120) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x71D0 (29136) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x71E0 (29152) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x71F0 (29168) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xD6BA, 0x4228, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x7200 (29184) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x9CF3, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7210 (29200) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7220 (29216) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xE73C, 0xBDD7, 0x7BCF, 0x39C7, 0x1082, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x7230 (29232) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x7240 (29248) pixels + 0x4228, 0xC638, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7250 (29264) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7260 (29280) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7270 (29296) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7280 (29312) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7290 (29328) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0x94B2, 0x0861, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x72A0 (29344) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x52AA, 0xEF7D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x72B0 (29360) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x72C0 (29376) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x72D0 (29392) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x72E0 (29408) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xC618, 0x3186, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x72F0 (29424) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0841, 0x738E, 0xEF7D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7300 (29440) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7310 (29456) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xEF5D, 0xCE59, 0xAD75, 0x9492, 0x73AE, 0x630C, 0x4A49, // 0x7320 (29472) pixels + 0x39C7, 0x2945, 0x18E3, 0x10A2, 0x0841, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x2965, 0x7BEF, // 0x7330 (29488) pixels + 0xDEDB, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7340 (29504) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7350 (29520) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7360 (29536) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7370 (29552) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7380 (29568) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF7D, 0x9492, 0x0841, 0x0000, 0x0000, 0x0000, 0x0000, // 0x7390 (29584) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2104, 0xC638, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x73A0 (29600) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x73B0 (29616) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x73C0 (29632) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x73D0 (29648) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xBDD7, 0x39C7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x73E0 (29664) pixels + 0x0000, 0x0000, 0x0000, 0x0020, 0x52AA, 0xB5B6, 0xF79E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x73F0 (29680) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7400 (29696) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xF7BE, 0xF79E, // 0x7410 (29712) pixels + 0xEF5D, 0xE73C, 0xDEFB, 0xD69A, 0xC638, 0xB5B6, 0xA534, 0x94B2, 0x8410, 0x738E, 0x632C, 0x632C, 0x7BEF, 0xB596, 0xE71C, 0xFFDF, // 0x7420 (29728) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7430 (29744) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7440 (29760) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7450 (29776) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7460 (29792) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7470 (29808) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0x6B4D, 0x0000, 0x0000, 0x0000, 0x0000, // 0x7480 (29824) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0861, 0x9CF3, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7490 (29840) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x74A0 (29856) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x74B0 (29872) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x74C0 (29888) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xDEDB, 0x8C71, 0x4208, 0x0861, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x74D0 (29904) pixels + 0x0000, 0x2945, 0x7BCF, 0xC618, 0xF79E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x74E0 (29920) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x74F0 (29936) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7500 (29952) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7510 (29968) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7520 (29984) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7530 (30000) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7540 (30016) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7550 (30032) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7560 (30048) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xB5B6, 0x0000, 0x0000, 0x0000, 0x0000, // 0x7570 (30064) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2104, 0xAD55, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7580 (30080) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7590 (30096) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x75A0 (30112) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x75B0 (30128) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF7D, 0xC638, 0x8C51, 0x632C, 0x7BEF, 0xAD55, 0xBDF7, // 0x75C0 (30144) pixels + 0xCE79, 0xEF5D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x75D0 (30160) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x75E0 (30176) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x75F0 (30192) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7600 (30208) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7610 (30224) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7620 (30240) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7630 (30256) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7640 (30272) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7650 (30288) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xE73C, 0x39C7, 0x0000, 0x0000, 0x0000, // 0x7660 (30304) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x18C3, 0x73AE, 0xCE79, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7670 (30320) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7680 (30336) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7690 (30352) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x76A0 (30368) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x76B0 (30384) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x76C0 (30400) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x76D0 (30416) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x76E0 (30432) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x76F0 (30448) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7700 (30464) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7710 (30480) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7720 (30496) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7730 (30512) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7740 (30528) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x8430, 0x0000, 0x0000, 0x0000, // 0x7750 (30544) pixels + 0x0000, 0x0000, 0x0841, 0x31A6, 0x8430, 0xD69A, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7760 (30560) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7770 (30576) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7780 (30592) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7790 (30608) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x77A0 (30624) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x77B0 (30640) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x77C0 (30656) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x77D0 (30672) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x77E0 (30688) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x77F0 (30704) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7800 (30720) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7810 (30736) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7820 (30752) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7830 (30768) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xD69A, 0x39E7, 0x18C3, 0x738E, // 0x7840 (30784) pixels + 0xA534, 0xBDF7, 0xD6BA, 0xEF7D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7850 (30800) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7860 (30816) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7870 (30832) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7880 (30848) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7890 (30864) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x78A0 (30880) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x78B0 (30896) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x78C0 (30912) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x78D0 (30928) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x78E0 (30944) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x78F0 (30960) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7900 (30976) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7910 (30992) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7920 (31008) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xDEFB, 0xD69A, 0xF7BE, // 0x7930 (31024) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7940 (31040) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7950 (31056) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7960 (31072) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7970 (31088) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7980 (31104) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x7990 (31120) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x79A0 (31136) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x79B0 (31152) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x79C0 (31168) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x79D0 (31184) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x79E0 (31200) pixels +}}; +}; +} diff --git a/src/icons/modes.h b/src/icons/modes.h new file mode 100644 index 0000000..a985038 --- /dev/null +++ b/src/icons/modes.h @@ -0,0 +1,46 @@ +#pragma once + +#include "icon.h" + +namespace { +namespace icons { +const Icon<24, 24> modes{{ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x1974, 0x000D, 0x000F, 0x0072, 0x0934, 0x0934, 0x0091, 0x000E, 0x0001, // 0x0010 (16) pixels + 0x1174, 0x0007, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x641A, 0x0010, 0x08D3, // 0x0020 (32) pixels + 0x3AB6, 0x63D8, 0x7C79, 0x84DA, 0x84BA, 0x7459, 0x53B8, 0x3295, 0x090F, 0x0006, 0x4BDC, 0x0069, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0030 (48) pixels + 0x0000, 0x0000, 0x0000, 0x000F, 0x0008, 0x0892, 0x3A76, 0x84FB, 0xC69D, 0xE75F, 0xF7DF, 0xFFFF, 0xF7FF, 0xEFBF, 0xDF5E, 0xAE5D, // 0x0040 (64) pixels + 0x6C9A, 0x2A75, 0x08CC, 0x0000, 0x0006, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000B, 0x000D, 0x1933, 0x53B9, 0xAE5D, 0xDF9D, // 0x0050 (80) pixels + 0xEFBD, 0xF7BE, 0xF7DE, 0xF7DE, 0xEFBD, 0xEF9D, 0xEF9C, 0xEF9D, 0xD75D, 0x95FD, 0x4378, 0x114F, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0060 (96) pixels + 0x0000, 0x000F, 0x000A, 0x1933, 0x5BD9, 0xAE9B, 0xD75B, 0xD73A, 0xD75B, 0xDF7C, 0xEF9D, 0xE77C, 0xD73A, 0xD73A, 0xD73A, 0xD73A, // 0x0070 (112) pixels + 0xDF5A, 0xCF3B, 0x85FA, 0x4397, 0x114E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0013, 0x10B3, 0x4B78, 0x8DF8, 0xBED7, 0xCF19, 0xD75C, // 0x0080 (128) pixels + 0xE79E, 0xEFBE, 0xF7DF, 0xDF7B, 0xC6F8, 0xC6F8, 0xC6F8, 0xC6F8, 0xC6F8, 0xCEF8, 0xB696, 0x6D55, 0x3B36, 0x08AA, 0x0000, 0x0000, // 0x0090 (144) pixels + 0x0000, 0x0010, 0x3236, 0x5CB5, 0x9E35, 0xCF1B, 0xD75E, 0xE79F, 0xE79F, 0xEFBF, 0xF7DF, 0xCEFA, 0xBEB8, 0xBEB8, 0xBE97, 0xBEB9, // 0x00A0 (160) pixels + 0xBE97, 0xB677, 0xBEB7, 0x7D91, 0x4C75, 0x2232, 0x0003, 0x0000, 0x0012, 0x10D3, 0x53F8, 0x33EE, 0x7D97, 0xCF5F, 0xD75F, 0xDF7F, // 0x00B0 (176) pixels + 0xDF7F, 0xE79F, 0xCEFB, 0xAE36, 0xB678, 0xB678, 0xB699, 0xB678, 0xAE16, 0xAE16, 0x95B4, 0x43CA, 0x2B6B, 0x4BD8, 0x08EA, 0x0000, // 0x00C0 (192) pixels + 0x000C, 0x3A76, 0x43F5, 0x3414, 0x5D5C, 0x863F, 0xB6DF, 0xCF3F, 0xCF3E, 0xB639, 0x9D95, 0x9595, 0x9595, 0x9D95, 0x9DB5, 0x9D95, // 0x00D0 (208) pixels + 0x8D34, 0x642F, 0x22A8, 0x01C4, 0x0A06, 0x4C36, 0x2232, 0x0000, 0x000F, 0x4317, 0x3BB3, 0x4CDA, 0x5D9F, 0x65BF, 0x6DDF, 0x8E3F, // 0x00E0 (224) pixels + 0x961D, 0x6431, 0x640F, 0x6450, 0x6450, 0x6410, 0x53CE, 0x432C, 0x2289, 0x0A29, 0x01A6, 0x01C6, 0x0185, 0x3B91, 0x3AF4, 0x0003, // 0x00F0 (240) pixels + 0x1092, 0x4B57, 0x2B6F, 0x1AEC, 0x33F3, 0x551B, 0x659F, 0x6DBF, 0x6DDF, 0x4434, 0x1268, 0x0A47, 0x0A47, 0x0A26, 0x0206, 0x01E5, // 0x0100 (256) pixels + 0x01E5, 0x12AA, 0x128A, 0x1AEC, 0x1289, 0x334E, 0x4354, 0x0046, 0x2155, 0x4334, 0x1AE9, 0x0245, 0x0A66, 0x12EA, 0x4CD9, 0x659F, // 0x0110 (272) pixels + 0x65BF, 0x65BE, 0x54D9, 0x4CB8, 0x2B6E, 0x0245, 0x0A66, 0x0A66, 0x0A66, 0x0A86, 0x236E, 0x3C34, 0x4C95, 0x5494, 0x4BB5, 0x0066, // 0x0120 (288) pixels + 0x2135, 0x4334, 0x1B49, 0x0AC6, 0x0AC6, 0x0AA5, 0x1B2A, 0x4CF9, 0x5D9F, 0x5D9F, 0x659F, 0x65BF, 0x4496, 0x0AC6, 0x0AC6, 0x0AC6, // 0x0130 (304) pixels + 0x0AA5, 0x2BAE, 0x5D7C, 0x54D7, 0x4452, 0x85FC, 0x53F6, 0x0046, 0x1093, 0x4314, 0x2389, 0x0B06, 0x1306, 0x0B05, 0x23AD, 0x553C, // 0x0140 (320) pixels + 0x5D7F, 0x5D7F, 0x5D7F, 0x5D9F, 0x44F9, 0x1327, 0x0B06, 0x0B06, 0x1B69, 0x5D3A, 0x6DBD, 0x5D17, 0x7DDA, 0xA69E, 0x4B75, 0x0004, // 0x0150 (336) pixels + 0x000E, 0x42F5, 0x340C, 0x1365, 0x1366, 0x1BA8, 0x4CF7, 0x65BF, 0x5D9F, 0x5D7F, 0x5D7F, 0x5D9F, 0x553B, 0x1BA9, 0x1345, 0x1BA8, // 0x0160 (352) pixels + 0x4CD5, 0x7DFF, 0x75BB, 0x2C0B, 0x342B, 0x7D98, 0x3AB3, 0x0002, 0x0002, 0x3A35, 0x5472, 0x13C5, 0x346C, 0x6DBA, 0x75FF, 0x75DF, // 0x0170 (368) pixels + 0x6DDF, 0x6DBF, 0x6DBF, 0x6DBF, 0x6DBF, 0x3CB1, 0x1BC6, 0x44D1, 0x7DDD, 0x861E, 0x7DFA, 0x2C29, 0x2427, 0x7538, 0x19AE, 0x0000, // 0x0180 (384) pixels + 0x0019, 0x088F, 0x5BF6, 0x3CCB, 0x6DB5, 0x9E9F, 0x8E3F, 0x861F, 0x861F, 0x7DFF, 0x7DFF, 0x7DFF, 0x7DFF, 0x75DB, 0x6D97, 0x863E, // 0x0190 (400) pixels + 0x9E7F, 0x85F9, 0x9E7C, 0x8E16, 0x85F5, 0x53D6, 0x0066, 0x0000, 0x0000, 0x0005, 0x31F4, 0x6D35, 0x7E15, 0xAEBF, 0xA69F, 0x9E7F, // 0x01A0 (416) pixels + 0x965F, 0x965F, 0x965F, 0x965F, 0x965F, 0x967F, 0x9E9F, 0xA69F, 0xAEBF, 0xAEBE, 0xC71F, 0xDF9F, 0xA5FC, 0x196D, 0x0000, 0x0000, // 0x01B0 (432) pixels + 0x0000, 0x001D, 0x084C, 0x4B15, 0x9639, 0xC73E, 0xBF1F, 0xB6DF, 0xB6DF, 0xAEBF, 0xAEBF, 0xAEBF, 0xAEBF, 0xAEDF, 0xB6DF, 0xBEFF, // 0x01C0 (448) pixels + 0xC73F, 0xD75F, 0xEFBF, 0xC6BE, 0x3AB3, 0x0023, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x10CD, 0x63B7, 0xCEFE, 0xE79F, 0xD75F, // 0x01D0 (464) pixels + 0xD75F, 0xCF3F, 0xCF3F, 0xC71F, 0xCF3F, 0xCF3F, 0xD75F, 0xDF7F, 0xE79F, 0xF7DF, 0xCEDE, 0x4B34, 0x0066, 0x0000, 0x0000, 0x0000, // 0x01E0 (480) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x088C, 0x5316, 0xBE3D, 0xE79E, 0xC77A, 0xCF5B, 0xD77D, 0xDF9E, 0xDF7D, 0xEFBE, 0xF7DF, 0xFFFF, // 0x01F0 (496) pixels + 0xEFBF, 0xADFC, 0x3AB3, 0x0046, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0005, 0x0000, 0x0028, 0x2190, 0x63F6, // 0x0200 (512) pixels + 0x6552, 0x5DEF, 0x664E, 0x7690, 0x6E8E, 0x86B2, 0xA6B7, 0xADFB, 0x63B6, 0x194D, 0x0003, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0210 (528) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0007, 0x0000, 0x0002, 0x0849, 0x2190, 0x3270, 0x3B30, 0x3B90, 0x3B90, 0x2B0F, 0x224F, 0x114C, // 0x0220 (544) pixels + 0x0046, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0003, 0x0000, // 0x0230 (560) pixels + 0x0000, 0x0004, 0x0006, 0x0007, 0x0007, 0x0006, 0x0003, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0240 (576) pixels +}}; +} +} diff --git a/src/icons/poweroff.h b/src/icons/poweroff.h new file mode 100644 index 0000000..6131d8e --- /dev/null +++ b/src/icons/poweroff.h @@ -0,0 +1,46 @@ +#pragma once + +#include "icon.h" + +namespace { +namespace icons { +const Icon<24, 24> poweroff{{ + 0xEAEB, 0xEB0C, 0xE208, 0xD904, 0xD904, 0xD904, 0xD904, 0xD904, 0xD904, 0xD904, 0xD904, 0xD904, 0xD904, 0xD904, 0xD904, 0xD104, // 0x0010 (16) pixels + 0xD104, 0xD104, 0xD104, 0xD104, 0xD124, 0xE269, 0xEB4D, 0xEAAA, 0xEB0C, 0xEC71, 0xE410, 0xDB4D, 0xDB4D, 0xDB4D, 0xDB4D, 0xDB4D, // 0x0020 (32) pixels + 0xDB4D, 0xDB4D, 0xDB4D, 0xDB4D, 0xDB4D, 0xDB4D, 0xDB4D, 0xDB4D, 0xD34D, 0xD34D, 0xD34D, 0xD34D, 0xD34D, 0xE451, 0xEC51, 0xDA8A, // 0x0030 (48) pixels + 0xD9C7, 0xDBEF, 0xDD34, 0xD4F3, 0xD4F3, 0xD4F3, 0xD4F3, 0xD4F3, 0xD4F3, 0xD4F3, 0xD4F3, 0xD4F3, 0xD4F3, 0xD4F3, 0xD4F3, 0xD4F3, // 0x0040 (64) pixels + 0xD4F3, 0xD4F3, 0xD4F3, 0xD4F3, 0xD4F3, 0xDD34, 0xD3CF, 0xC965, 0xC000, 0xC28A, 0xD492, 0xD4D3, 0xD4B2, 0xD4B2, 0xD4B2, 0xCCB2, // 0x0050 (80) pixels + 0xD4B2, 0xD4B2, 0xD4B2, 0xD4B2, 0xD4B2, 0xD4B2, 0xD4B2, 0xD4B2, 0xD4B2, 0xD4B2, 0xD4B2, 0xD4B2, 0xD4D3, 0xD4D3, 0xBB0C, 0xB000, // 0x0060 (96) pixels + 0xC000, 0xC249, 0xCC51, 0xCC71, 0xCC71, 0xC471, 0xBCF3, 0xBCF3, 0xC471, 0xCC71, 0xCC71, 0xBCB2, 0xBCB2, 0xCC71, 0xCC71, 0xC471, // 0x0070 (112) pixels + 0xBCD3, 0xBCF3, 0xC471, 0xCC71, 0xCC71, 0xCC92, 0xBAEB, 0xB000, 0xB800, 0xBA28, 0xCC10, 0xCC10, 0xC430, 0xC575, 0xDEDB, 0xDEFB, // 0x0080 (128) pixels + 0xCD75, 0xC3EF, 0xCD14, 0xDEDB, 0xDEDB, 0xCD14, 0xC3EF, 0xCD75, 0xDEDB, 0xD6DB, 0xC575, 0xC430, 0xCC10, 0xCC51, 0xBACB, 0xA820, // 0x0090 (144) pixels + 0xB800, 0xB9E7, 0xC3AE, 0xC3AE, 0xC4D3, 0xDEDB, 0xEF5D, 0xEF7D, 0xDDD7, 0xC3AE, 0xDDD7, 0xEF7D, 0xEF7D, 0xDDD7, 0xC3AE, 0xDDD7, // 0x00A0 (160) pixels + 0xEF7D, 0xE73C, 0xDEDB, 0xC4D3, 0xC3AE, 0xC3EF, 0xB2AA, 0xA820, 0xB800, 0xB1C7, 0xBB4D, 0xBBAE, 0xD638, 0xEF5D, 0xEF7D, 0xE679, // 0x00B0 (176) pixels + 0xC3EF, 0xBB4D, 0xDDD7, 0xEF7D, 0xEF7D, 0xDDD7, 0xBB4D, 0xC3EF, 0xE679, 0xEF5D, 0xE73C, 0xCE38, 0xBBAE, 0xC3AE, 0xB28A, 0xA820, // 0x00C0 (192) pixels + 0xB000, 0xB1A6, 0xBAEB, 0xC451, 0xE71C, 0xEF5D, 0xEF3C, 0xCC71, 0xBB2C, 0xBB2C, 0xDDB6, 0xEF7D, 0xEF7D, 0xDDB6, 0xBB2C, 0xBB2C, // 0x00D0 (208) pixels + 0xCC71, 0xEF1C, 0xE75D, 0xDEFB, 0xBC51, 0xBB4D, 0xB269, 0xA041, 0xB000, 0xB165, 0xB2AA, 0xCD34, 0xE75D, 0xEF7D, 0xE638, 0xBB4C, // 0x00E0 (224) pixels + 0xBB0B, 0xC30A, 0xD595, 0xEF5D, 0xEF5D, 0xD595, 0xC30A, 0xBB0B, 0xBB4C, 0xE638, 0xEF5D, 0xE73C, 0xCD34, 0xBB2C, 0xB269, 0xA041, // 0x00F0 (240) pixels + 0xB000, 0xA945, 0xB269, 0xD5B6, 0xEF7D, 0xEF7D, 0xDDB6, 0xBAEA, 0xC2EA, 0xC2E9, 0xD574, 0xE73C, 0xE73C, 0xD574, 0xC2E9, 0xC2EA, // 0x0100 (256) pixels + 0xBAEA, 0xDDB6, 0xEF5D, 0xE75D, 0xD5B6, 0xB28A, 0xA186, 0xA000, 0xA800, 0xA0C2, 0xA104, 0xD575, 0xEF7D, 0xEF7D, 0xDD95, 0xC2C9, // 0x0110 (272) pixels + 0xC2E9, 0xCAE8, 0xDD74, 0xE71C, 0xE71C, 0xDD54, 0xCB09, 0xCB2A, 0xC30A, 0xDD95, 0xEF7D, 0xEF7D, 0xCCF3, 0x9000, 0x9040, 0x9800, // 0x0120 (288) pixels + 0xA800, 0x9841, 0x8800, 0xC451, 0xEF7D, 0xEF9E, 0xD5D6, 0xBA05, 0xC1E4, 0xC202, 0xD4F2, 0xDEFB, 0xDEFB, 0xD4D1, 0xC1A0, 0xB960, // 0x0130 (304) pixels + 0xB183, 0xD595, 0xEF9E, 0xEF7D, 0xC430, 0x8800, 0x9061, 0x9800, 0xA820, 0x9861, 0x8800, 0xB2CA, 0xEF5D, 0xF79E, 0xE6BA, 0xBAA8, // 0x0140 (320) pixels + 0xC0E0, 0xC120, 0xD2E7, 0xE5D6, 0xE5D6, 0xD2E7, 0xC920, 0xC100, 0xBAA8, 0xE6BA, 0xEF9E, 0xEF5D, 0xB2AA, 0x8800, 0x9061, 0x9820, // 0x0150 (336) pixels + 0xA820, 0x9881, 0x9000, 0xA000, 0xE658, 0xF79E, 0xEF7D, 0xCD74, 0xB980, 0xD160, 0xD9A0, 0xDA41, 0xDA40, 0xD9A0, 0xD160, 0xB980, // 0x0160 (352) pixels + 0xCD54, 0xEF7D, 0xF79E, 0xE638, 0xA000, 0x9000, 0x9081, 0x9820, 0xA020, 0x98A2, 0x9040, 0x9800, 0xC3AD, 0xEF5D, 0xEF7D, 0xE73C, // 0x0170 (368) pixels + 0xCD95, 0xC283, 0xD1E0, 0xE200, 0xE200, 0xD9E0, 0xC283, 0xC554, 0xE71C, 0xEF7D, 0xEF5D, 0xC3AD, 0x9800, 0x9060, 0x90A2, 0x9820, // 0x0180 (384) pixels + 0xA020, 0x98A2, 0x9060, 0x9840, 0xA943, 0xDD74, 0xF77D, 0xEF5D, 0xE73C, 0xCE58, 0xBCD1, 0xBC0D, 0xBC0C, 0xBCB0, 0xC617, 0xDEFB, // 0x0190 (400) pixels + 0xE73C, 0xEF7D, 0xDD74, 0xA943, 0x9860, 0x9060, 0x90C2, 0x9020, 0xA040, 0x98C2, 0x9060, 0x9860, 0xA880, 0xB9E4, 0xE5B5, 0xEF3C, // 0x01A0 (416) pixels + 0xE75D, 0xE73C, 0xDEFB, 0xCEBA, 0xCE7A, 0xCE9A, 0xDEDB, 0xE73C, 0xEF1C, 0xE595, 0xB9E4, 0xA880, 0x9860, 0x9880, 0x90C2, 0x9040, // 0x01B0 (432) pixels + 0xA040, 0x98E2, 0x9080, 0x9860, 0xA8A0, 0xB0A0, 0xC1C1, 0xDC90, 0xEE57, 0xEF1B, 0xE73C, 0xDF1C, 0xDEFC, 0xDEFB, 0xE6FB, 0xE637, // 0x01C0 (448) pixels + 0xDC8F, 0xC1C1, 0xB0A0, 0xA8A0, 0x9860, 0x9880, 0x90E2, 0x9040, 0x9840, 0x98E2, 0x9080, 0x9840, 0xA0A0, 0xB0E0, 0xB920, 0xC160, // 0x01D0 (464) pixels + 0xD265, 0xE3CB, 0xECF0, 0xED72, 0xED72, 0xECCF, 0xE3CB, 0xD285, 0xC960, 0xB920, 0xB0E0, 0xA8A0, 0x9860, 0x9080, 0x9102, 0x9060, // 0x01E0 (480) pixels + 0x9861, 0x9902, 0x9081, 0x9840, 0xA080, 0xA8C0, 0xB900, 0xC140, 0xC960, 0xD180, 0xD980, 0xD9C0, 0xD9C0, 0xD980, 0xD180, 0xC960, // 0x01F0 (496) pixels + 0xC140, 0xB900, 0xA8C0, 0xA080, 0x9840, 0x9081, 0x9102, 0x9060, 0xA0E3, 0xA1C5, 0x9984, 0x98E1, 0xA101, 0xA921, 0xB161, 0xB981, // 0x0200 (512) pixels + 0xC1A1, 0xC9E1, 0xC9E1, 0xD201, 0xD201, 0xC9E1, 0xC9E1, 0xC1C1, 0xB981, 0xB161, 0xA921, 0xA101, 0x98E1, 0x9943, 0x9163, 0x9040, // 0x0210 (528) pixels + 0xA8C3, 0xA1A5, 0x9984, 0x9102, 0x9122, 0x9942, 0x9942, 0x9962, 0x9962, 0x9982, 0x9982, 0x9982, 0x9982, 0x9982, 0x9982, 0x9962, // 0x0220 (544) pixels + 0x9962, 0x9142, 0x9142, 0x9122, 0x9122, 0x9143, 0x8903, 0x9820, 0xB000, 0xA061, 0x9061, 0x9020, 0x9020, 0x9020, 0x9020, 0x9020, // 0x0230 (560) pixels + 0x9020, 0x9020, 0x9020, 0x8820, 0x8820, 0x8820, 0x8820, 0x8820, 0x8820, 0x8820, 0x8820, 0x8820, 0x9040, 0x9040, 0x9820, 0xB800, // 0x0240 (576) pixels +}}; +} +} diff --git a/src/icons/presets.h b/src/icons/presets.h new file mode 100644 index 0000000..5485a9c --- /dev/null +++ b/src/icons/presets.h @@ -0,0 +1,46 @@ +#pragma once + +#include "icon.h" + +namespace { +namespace icons { +const Icon<24, 24> presets{{ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x12A0, 0x43A1, 0xFFF7, 0x0A80, 0x3B80, 0x4BE3, 0x5404, 0x5404, 0x43C2, 0x2B20, 0x0000, // 0x0010 (16) pixels + 0x6464, 0x3360, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x01A0, 0x5403, 0x0000, 0x3BA1, 0x5C45, // 0x0020 (32) pixels + 0x74E9, 0x854B, 0x958D, 0x95AD, 0x958D, 0x8D6C, 0x7D0A, 0x6487, 0x4BE3, 0x2B20, 0x6486, 0x3B80, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0030 (48) pixels + 0x0000, 0x0000, 0x0000, 0x5422, 0x22E0, 0x5404, 0x74E9, 0x958C, 0x9DCD, 0x9DED, 0x9DEC, 0x9DEC, 0x9DEC, 0x9DED, 0x9DED, 0x95AD, // 0x0040 (64) pixels + 0x852B, 0x6466, 0x3B81, 0xFFFF, 0x1AC0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2B40, 0x3340, 0x5C66, 0x852A, 0x95AC, 0x95AB, // 0x0050 (80) pixels + 0x8D89, 0x8DA8, 0x8DA9, 0x95C9, 0x8DC9, 0x8DA9, 0x8DA9, 0x8DAA, 0x95AC, 0x8D6C, 0x6CA8, 0x4BE2, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0060 (96) pixels + 0x0000, 0x3B80, 0x2B20, 0x5C65, 0x852A, 0x8D8B, 0x8568, 0x8568, 0x8DA8, 0x95E9, 0x9E0A, 0x9E0A, 0x9E0A, 0x95E9, 0x95C9, 0x8588, // 0x0070 (112) pixels + 0x8568, 0x8D6A, 0x8D6B, 0x6CC8, 0x4BE2, 0x6505, 0x0000, 0x0000, 0x0000, 0x1260, 0x5404, 0x7D09, 0x854A, 0x7D27, 0x7D47, 0x8DA8, // 0x0080 (128) pixels + 0x95E9, 0x9E2A, 0xA64B, 0xA64B, 0xA64B, 0xA62A, 0x9E0A, 0x8DC9, 0x8568, 0x7D27, 0x8549, 0x958D, 0x7508, 0x4460, 0x3C60, 0x0000, // 0x0090 (144) pixels + 0x0000, 0x43A1, 0x6CA7, 0x852A, 0x7507, 0x7D26, 0x8568, 0x95C9, 0x9E0A, 0xA64B, 0xA66B, 0xA66B, 0xA66B, 0xA64B, 0xA62A, 0x95E9, // 0x00A0 (160) pixels + 0x8D88, 0x8568, 0xA5EF, 0xC676, 0x9DD0, 0x64E5, 0x2C40, 0x0000, 0x0000, 0x5424, 0x74E9, 0x74E7, 0x6CE5, 0x7D27, 0x8588, 0x95C9, // 0x00B0 (176) pixels + 0x9E2A, 0xA64B, 0xA66B, 0xA66B, 0xA66B, 0xA66B, 0xA64B, 0x9DE9, 0x95EA, 0xB672, 0xDF1A, 0xDEFB, 0xBE35, 0x7D4A, 0x4CA1, 0x0000, // 0x00C0 (192) pixels + 0x2B20, 0x6466, 0x74E8, 0x64A5, 0x6CE5, 0x7D27, 0x8588, 0x95C9, 0x9E2A, 0xA66B, 0xAE6B, 0xA66B, 0xA66B, 0xA66B, 0xA64B, 0xA62C, // 0x00D0 (208) pixels + 0xCEF5, 0xEF9D, 0xEF7D, 0xDEFB, 0xC658, 0x956E, 0x5CE4, 0x02C0, 0x43A1, 0x6C87, 0x6CA7, 0x6484, 0x6CC5, 0x7D26, 0x8568, 0x95C9, // 0x00E0 (224) pixels + 0xA62B, 0xC6D1, 0xC6F2, 0xAE6C, 0xA66B, 0xA64B, 0xB68E, 0xDF37, 0xFFDE, 0xFFDF, 0xEF5D, 0xDEDB, 0xCE59, 0xA591, 0x6CE7, 0x0240, // 0x00F0 (240) pixels + 0x4BE3, 0x6487, 0x6485, 0x5C64, 0x6CC5, 0x7506, 0x8567, 0x95CA, 0xC6D3, 0xF7BC, 0xF7DD, 0xCF13, 0xAE6C, 0xB6AF, 0xE779, 0xFFFF, // 0x0100 (256) pixels + 0xFFFF, 0xF7BE, 0xE73C, 0xD6BA, 0xC638, 0x9550, 0x6487, 0x0260, 0x4BE3, 0x6486, 0x5C44, 0x5C43, 0x64A5, 0x74E6, 0x8D8A, 0xC6D4, // 0x0110 (272) pixels + 0xF7DD, 0xFFFF, 0xFFFF, 0xF7BC, 0xD736, 0xE79A, 0xFFFF, 0xFFFF, 0xFFDF, 0xEF7D, 0xE71C, 0xCE78, 0x954F, 0x74A9, 0x5C45, 0x12C0, // 0x0120 (288) pixels + 0x4BE3, 0x6466, 0x5424, 0x5423, 0x6484, 0x6CC5, 0x95CC, 0xE77B, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0130 (304) pixels + 0xF79E, 0xE73D, 0xCE98, 0x954E, 0x5C45, 0x5C65, 0x5C25, 0x12A0, 0x4BE2, 0x5C45, 0x5424, 0x4C02, 0x5C43, 0x6484, 0x74E7, 0xAE30, // 0x0140 (320) pixels + 0xEF9C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xF7BE, 0xEF5D, 0xCE98, 0x8D4D, 0x5C44, 0x4C03, 0x5C65, 0x5424, 0x0200, // 0x0150 (336) pixels + 0x3BA1, 0x5C45, 0x5C44, 0x4BE2, 0x5423, 0x5C43, 0x6484, 0x74E6, 0xA5EF, 0xE75B, 0xFFDF, 0xFFDF, 0xFFDF, 0xF7BE, 0xF79E, 0xE75C, // 0x0160 (352) pixels + 0xC677, 0x852B, 0x5C44, 0x4BE2, 0x5403, 0x5C66, 0x4C03, 0x01E0, 0x22E0, 0x5424, 0x6465, 0x4C02, 0x4BE2, 0x5423, 0x5C43, 0x5C64, // 0x0170 (368) pixels + 0x6CA5, 0x9DAE, 0xD6F9, 0xEF7D, 0xEF7D, 0xEF5D, 0xE71B, 0xBE35, 0x7CE9, 0x5443, 0x4C02, 0x4BE2, 0x5C44, 0x5C45, 0x43C1, 0x0000, // 0x0180 (384) pixels + 0x4BC0, 0x4BE2, 0x5C65, 0x5C44, 0x4BE2, 0x4BE2, 0x4C02, 0x5423, 0x5C43, 0x6485, 0x8D6C, 0xCE97, 0xDEFB, 0xD6BA, 0xADF2, 0x6CA8, // 0x0190 (400) pixels + 0x5423, 0x4BE2, 0x4BE2, 0x5423, 0x6465, 0x5424, 0x3B60, 0x0000, 0x0000, 0x3B80, 0x5424, 0x6486, 0x5C44, 0x4BE2, 0x4BE2, 0x4BE2, // 0x01A0 (416) pixels + 0x4C02, 0x5422, 0x5C44, 0x7CEA, 0xB5F4, 0x9D6F, 0x6466, 0x4BE2, 0x4BE2, 0x4BE2, 0x5403, 0x6485, 0x5C65, 0x43C2, 0x8581, 0x0000, // 0x01B0 (432) pixels + 0x0000, 0x0000, 0x3B61, 0x5C44, 0x6486, 0x5C64, 0x4C02, 0x4BE2, 0x4BE2, 0x4BE2, 0x4BE2, 0x4BE2, 0x5C45, 0x5404, 0x43E2, 0x4BE2, // 0x01C0 (448) pixels + 0x4BE2, 0x5423, 0x6485, 0x6465, 0x4BE3, 0x11C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x32E1, 0x5424, 0x64A6, 0x6485, 0x5C43, // 0x01D0 (464) pixels + 0x5423, 0x4C02, 0x4BE2, 0x4BE2, 0x4BE2, 0x4C02, 0x5402, 0x5423, 0x5C64, 0x64A5, 0x6465, 0x4B83, 0x1980, 0x0000, 0x0000, 0x0000, // 0x01E0 (480) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x2A21, 0x4BA3, 0x6465, 0x6CA6, 0x64A5, 0x6484, 0x5C64, 0x5C64, 0x5C64, 0x5C84, 0x6485, 0x6CA6, // 0x01F0 (496) pixels + 0x6CA6, 0x5C25, 0x3B02, 0x10E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1100, 0x32A2, 0x53A4, // 0x0200 (512) pixels + 0x6465, 0x6CA6, 0x6CC6, 0x6CC6, 0x6CC6, 0x6CA6, 0x6486, 0x5C04, 0x4323, 0x21C1, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0210 (528) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x1120, 0x2A41, 0x3B02, 0x4B83, 0x4BA4, 0x4B83, 0x4343, 0x32A2, 0x21A1, // 0x0220 (544) pixels + 0x0880, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0230 (560) pixels + 0x0000, 0x0000, 0x0880, 0x08E0, 0x08C0, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0240 (576) pixels +}}; +} +} diff --git a/src/icons/reboot.h b/src/icons/reboot.h new file mode 100644 index 0000000..59af11a --- /dev/null +++ b/src/icons/reboot.h @@ -0,0 +1,46 @@ +#pragma once + +#include "icon.h" + +namespace { +namespace icons { +const Icon<24, 24> reboot{{ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0010 (16) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0020 (32) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0030 (48) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1A50, 0x2251, 0x2291, 0x2271, 0x2271, 0x2271, 0x2271, 0x2250, // 0x0040 (64) pixels + 0x2271, 0x0000, 0x0000, 0x0000, 0x2251, 0x2271, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2250, 0x2271, // 0x0050 (80) pixels + 0x32F2, 0x5C16, 0x74B8, 0x8539, 0x8D5A, 0x74B8, 0x5C16, 0x3B33, 0x2271, 0x1A51, 0x0000, 0x2251, 0x2A91, 0x2251, 0x0000, 0x0000, // 0x0060 (96) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2251, 0x2271, 0x6457, 0x8D9A, 0x855A, 0x7D19, 0x74D9, 0x6CD9, 0x74F9, 0x7D19, 0x855A, // 0x0070 (112) pixels + 0x6C97, 0x2291, 0x2271, 0x2A91, 0x74B8, 0x2271, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2251, 0x32F2, 0x8539, 0x855A, // 0x0080 (128) pixels + 0x6CD9, 0x64B8, 0x64B8, 0x6498, 0x6498, 0x6478, 0x6478, 0x5C78, 0x74D9, 0x7CF9, 0x4374, 0x6C98, 0x8519, 0x2271, 0x0000, 0x0000, // 0x0090 (144) pixels + 0x0000, 0x0000, 0x0000, 0x2250, 0x2271, 0x7D19, 0x74F9, 0x64B8, 0x6498, 0x74D9, 0x7D19, 0x8539, 0x8539, 0x7CF9, 0x6CB8, 0x5C57, // 0x00A0 (160) pixels + 0x5C37, 0x6498, 0x7D19, 0x6CB8, 0x7CF9, 0x2251, 0x0000, 0x0000, 0x0000, 0x0000, 0x001F, 0x2271, 0x5C16, 0x7D19, 0x6498, 0x6498, // 0x00B0 (176) pixels + 0x7D19, 0x6C98, 0x3B33, 0x2A91, 0x2271, 0x3B13, 0x6437, 0x74F9, 0x5C57, 0x5417, 0x5C37, 0x5417, 0x74D8, 0x2251, 0x0000, 0x0000, // 0x00C0 (192) pixels + 0x0000, 0x0000, 0x2251, 0x32D2, 0x7D39, 0x6498, 0x6478, 0x74F9, 0x53F5, 0x2271, 0x2251, 0x1A71, 0x1A90, 0x2251, 0x2271, 0x4B95, // 0x00D0 (208) pixels + 0x74D8, 0x5437, 0x4BF6, 0x4BF6, 0x6CB8, 0x2250, 0x0000, 0x0000, 0x0000, 0x0000, 0x2270, 0x4BB5, 0x74D9, 0x5C78, 0x6CB8, 0x6457, // 0x00E0 (224) pixels + 0x2271, 0x2231, 0x0000, 0x0000, 0x0000, 0x2251, 0x2271, 0x6457, 0x5C57, 0x4BF6, 0x4BF6, 0x4BD6, 0x6C98, 0x2250, 0x0000, 0x0000, // 0x00F0 (240) pixels + 0x0000, 0x0000, 0x2291, 0x5C36, 0x6498, 0x5C57, 0x6CB8, 0x3B33, 0x2250, 0x0000, 0x0000, 0x0000, 0x2251, 0x2271, 0x5C16, 0x6C98, // 0x0100 (256) pixels + 0x6C98, 0x6C97, 0x6477, 0x6477, 0x6457, 0x2250, 0x0000, 0x0000, 0x0000, 0x0000, 0x2271, 0x6C98, 0x5C58, 0x5C37, 0x6CB8, 0x2A91, // 0x0110 (272) pixels + 0x2250, 0x0000, 0x0000, 0x0000, 0x2271, 0x2250, 0x2250, 0x2250, 0x2250, 0x2250, 0x2250, 0x2250, 0x2250, 0x2251, 0x0000, 0x0000, // 0x0120 (288) pixels + 0x0000, 0x0000, 0x2271, 0x6477, 0x5C37, 0x5417, 0x6C98, 0x2291, 0x1A70, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0130 (304) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2271, 0x53F6, 0x5C37, 0x5417, 0x5C57, 0x32F2, // 0x0140 (320) pixels + 0x2250, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2250, 0x3B34, 0x3334, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0150 (336) pixels + 0x0000, 0x0000, 0x2251, 0x4374, 0x5C37, 0x4BF6, 0x5417, 0x4BB5, 0x2271, 0x2210, 0x0000, 0x0000, 0x0000, 0x0000, 0x2250, 0x2271, // 0x0160 (352) pixels + 0x3B54, 0x3B54, 0x3334, 0x3334, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2250, 0x2AD2, 0x5C37, 0x4BD6, 0x4BD6, 0x5416, // 0x0170 (368) pixels + 0x3B13, 0x2270, 0x19CD, 0x08E7, 0x08E7, 0x19ED, 0x2250, 0x3313, 0x4374, 0x3313, 0x3313, 0x3334, 0x3334, 0x0000, 0x0000, 0x0000, // 0x0180 (384) pixels + 0x0000, 0x0000, 0x2AB0, 0x2271, 0x4395, 0x4BF6, 0x43B5, 0x43B5, 0x4BD6, 0x4374, 0x2AB2, 0x2271, 0x2271, 0x2AB2, 0x4374, 0x4B95, // 0x0190 (400) pixels + 0x3334, 0x3313, 0x3333, 0x3313, 0x2250, 0x08E6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x19CD, 0x2271, 0x4BB6, 0x43B5, 0x3B95, // 0x01A0 (416) pixels + 0x3B75, 0x4395, 0x4395, 0x43B5, 0x4395, 0x4395, 0x3B75, 0x3334, 0x3334, 0x3B54, 0x3B54, 0x2271, 0x1128, 0x0000, 0x0000, 0x0000, // 0x01B0 (432) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x1A0E, 0x2A91, 0x4395, 0x4395, 0x3B55, 0x3B54, 0x3354, 0x3334, 0x3334, 0x3334, 0x3334, 0x3334, // 0x01C0 (448) pixels + 0x4395, 0x4BB5, 0x2291, 0x19CD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0021, 0x1A0E, 0x2270, 0x3313, // 0x01D0 (464) pixels + 0x3B75, 0x3B54, 0x3334, 0x3334, 0x3334, 0x3B54, 0x3B75, 0x4395, 0x3B34, 0x2271, 0x1A0E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x01E0 (480) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1128, 0x2250, 0x2271, 0x2AD2, 0x32F3, 0x3334, 0x3B34, 0x3314, 0x32F3, 0x2271, // 0x01F0 (496) pixels + 0x1A30, 0x0928, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0021, // 0x0200 (512) pixels + 0x118B, 0x19EE, 0x1A2F, 0x2250, 0x2250, 0x1A30, 0x1A0E, 0x118B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0210 (528) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0220 (544) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0230 (560) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0240 (576) pixels +}}; +} +} diff --git a/src/icons/scan.h b/src/icons/scan.h new file mode 100644 index 0000000..b927d03 --- /dev/null +++ b/src/icons/scan.h @@ -0,0 +1,46 @@ +#pragma once + +#include "icon.h" + +namespace { +namespace icons { +const Icon<24, 24> scan{{ + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x39E7, 0xA514, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xBDF7, // 0x0010 (16) pixels + 0x2965, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x7BEF, 0x4208, 0x7BAF, 0x0000, // 0x0020 (32) pixels + 0x736E, 0xCE79, 0xDEDB, 0xCE79, 0xCE79, 0xDEDB, 0xCE39, 0x738E, 0x0000, 0x73AE, 0x39C7, 0x5AEB, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0030 (48) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0x94B2, 0x528A, 0x73AE, 0x52AA, 0xDEBB, 0xFFDF, 0x7C4F, 0x94F2, 0xA594, 0x8CD1, 0x9512, 0xBE37, 0xF7DE, // 0x0040 (64) pixels + 0xDEDB, 0x4A49, 0xFFFF, 0x39C7, 0x7BCF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xA514, 0x6B8E, 0x528A, 0x8C30, 0xE73C, 0xB5F6, // 0x0050 (80) pixels + 0x5BAB, 0x742E, 0x740E, 0x9DB3, 0x6C0D, 0x42A7, 0x0180, 0x0120, 0xB5D6, 0xEF7D, 0x8C31, 0x31C6, 0x6B4D, 0x8430, 0xFFFF, 0xFFFF, // 0x0060 (96) pixels + 0xFFFF, 0xB596, 0x9492, 0x73AE, 0x94B2, 0xCE79, 0x84B0, 0x6BED, 0x8490, 0x7C6F, 0x63CC, 0x9572, 0x5B6A, 0x3AA7, 0x3286, 0x2243, // 0x0070 (112) pixels + 0x0000, 0x5B4A, 0xCE79, 0x9CD3, 0x5B0B, 0x73AE, 0x8430, 0xFFFF, 0xFFFF, 0x73AE, 0x6B6D, 0x73AE, 0xADB5, 0x744E, 0x744E, 0x7C6F, // 0x0080 (128) pixels + 0x744E, 0x6BED, 0x5329, 0x9572, 0x5B4A, 0x2224, 0x1A23, 0x0A41, 0x12E1, 0x0180, 0x3A87, 0xADB5, 0x6B4D, 0x0000, 0x7BEF, 0xFFFF, // 0x0090 (144) pixels + 0x0000, 0x8410, 0x8410, 0x9CF3, 0xA574, 0x7C6F, 0x8490, 0x7C4F, 0x6BED, 0x5BAB, 0x42C8, 0x84D0, 0x3AA9, 0x11A1, 0x1301, 0x2B87, // 0x00A0 (160) pixels + 0x0260, 0x1BC2, 0x01E0, 0x7C6F, 0xAD55, 0x632C, 0x632C, 0x5AEB, 0x94B2, 0xB5B6, 0x7BCF, 0xB5F6, 0x6C0D, 0x84D1, 0x84F1, 0x6C0D, // 0x00B0 (176) pixels + 0x63AC, 0x5329, 0x3A67, 0x8D31, 0x536D, 0x00E0, 0x0300, 0x4D2D, 0x0280, 0x0B21, 0x2403, 0x0140, 0xAE16, 0x83D0, 0x7BEF, 0x7BEF, // 0x00C0 (192) pixels + 0x8C51, 0x7BEF, 0xAD75, 0x6C0D, 0x84B0, 0x84F0, 0x748E, 0x742D, 0x534A, 0x4AC9, 0x2144, 0x84F1, 0x0000, 0x0AA0, 0x0B61, 0x02C0, // 0x00D0 (208) pixels + 0x2483, 0x02E0, 0x1402, 0x0BA0, 0x1B84, 0xBDF7, 0x62EC, 0x5AAB, 0xC618, 0x83F0, 0xB5D6, 0x536A, 0x7C8F, 0x6C2D, 0x642C, 0x63EC, // 0x00E0 (224) pixels + 0x532A, 0x4228, 0x09A1, 0x84F0, 0x1A23, 0x0340, 0x2483, 0x1C43, 0x2C64, 0x1C02, 0x13A3, 0x45AB, 0x0320, 0xAE16, 0x7BAF, 0x8C91, // 0x00F0 (240) pixels + 0x9D13, 0x9492, 0xA574, 0x534A, 0x7C4F, 0x4B49, 0x746D, 0x4327, 0x5B6B, 0x00E0, 0x0340, 0x7DD0, 0x0580, 0x04A0, 0x0300, 0x24E2, // 0x0100 (256) pixels + 0x02E0, 0x15A0, 0x02A0, 0x04A0, 0x0340, 0x8D91, 0x9472, 0x7BEF, 0x94B2, 0xA514, 0xA5B5, 0x8CF1, 0x9552, 0x84EF, 0x9552, 0x848E, // 0x0110 (272) pixels + 0x8CF1, 0x7CAF, 0x4D69, 0xE47C, 0xE67C, 0x560A, 0x8570, 0x8590, 0x9572, 0x8E51, 0x8531, 0x85D0, 0x5CEB, 0x8570, 0xA514, 0x73CE, // 0x0120 (288) pixels + 0x94B2, 0xAD75, 0xA574, 0x534A, 0x6BED, 0x32C4, 0x8593, 0x8DD6, 0x5329, 0x01A0, 0x2CA7, 0x5D2C, 0xA654, 0x65CC, 0x0440, 0x0CC1, // 0x0130 (304) pixels + 0x1C23, 0x2683, 0x0380, 0x0D21, 0x4CE9, 0x85D0, 0xB556, 0x73CE, 0x9492, 0xB576, 0xB5F6, 0x2224, 0x5B8B, 0x2264, 0x4B88, 0x4329, // 0x0140 (320) pixels + 0x6C0C, 0x3264, 0x5530, 0x75D1, 0x648C, 0x7DEF, 0x0480, 0x3DC7, 0x0CA2, 0x2DC6, 0x0440, 0x2584, 0x0460, 0x9E94, 0xB536, 0x73CE, // 0x0150 (336) pixels + 0xFFFF, 0x9CF3, 0xDEFB, 0x0160, 0x4B09, 0x2A65, 0x2243, 0x4BA7, 0x19C2, 0x636C, 0x19A3, 0x746E, 0x1943, 0x95B2, 0x4608, 0x14E2, // 0x0160 (352) pixels + 0x35C7, 0x1D43, 0x1523, 0x2DC5, 0x0500, 0xD73B, 0x9C93, 0x5B0B, 0x9CD3, 0x738E, 0xEF3D, 0x6C0D, 0x0100, 0x42E9, 0x0080, 0x4B49, // 0x0170 (368) pixels + 0x3206, 0x00C2, 0x3A68, 0x8CF1, 0x3967, 0x740E, 0x8610, 0x0500, 0x35C5, 0x04A0, 0x35E6, 0x0520, 0x460B, 0xEF3D, 0x632C, 0x8C51, // 0x0180 (384) pixels + 0x8C51, 0xFFFF, 0xB575, 0xEF7D, 0x0060, 0x21E4, 0x42C8, 0x0120, 0x4B49, 0x4308, 0x334C, 0x8CF1, 0x3227, 0x0000, 0xA634, 0x05E0, // 0x0190 (400) pixels + 0x7E32, 0x6E91, 0x2583, 0x0500, 0xDFBC, 0xB576, 0x0000, 0x73AE, 0xF79E, 0x8C71, 0x738E, 0xD67A, 0xBDF7, 0x0000, 0x2A05, 0x42C8, // 0x01A0 (416) pixels + 0x0000, 0x1942, 0x0180, 0x8D51, 0x4B69, 0x2204, 0x3266, 0x9652, 0x7714, 0x566F, 0x04C0, 0xAEF6, 0xD69A, 0x632C, 0x7BEF, 0xD69A, // 0x01B0 (432) pixels + 0xFFFF, 0x94B2, 0x52AA, 0x630C, 0xDEFB, 0x8450, 0x0000, 0x19C3, 0x4B49, 0x19A3, 0x00A0, 0x84F0, 0x2A45, 0x1181, 0x0080, 0xA614, // 0x01C0 (448) pixels + 0x6DAD, 0x04C0, 0x7E2F, 0xDEFB, 0x630C, 0x52AA, 0x7BEF, 0xFFFF, 0xFFFF, 0xFFFF, 0x52AA, 0x0000, 0x738E, 0xD69A, 0xB5B5, 0x2A05, // 0x01D0 (464) pixels + 0x0000, 0x3226, 0x2223, 0x8510, 0x3AA6, 0x3286, 0x3225, 0x01A0, 0x65AC, 0xAEB5, 0xC679, 0x7B8F, 0x0000, 0x738E, 0xFFFF, 0xFFFF, // 0x01E0 (480) pixels + 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x41E8, 0x9472, 0xD6BA, 0x9D53, 0x0140, 0x0000, 0x74AE, 0x00E0, 0x0000, 0x0140, 0x84B0, // 0x01F0 (496) pixels + 0xCE99, 0x8C51, 0x41E8, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xCE59, 0x1082, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0200 (512) pixels + 0x9451, 0xCE59, 0xBE17, 0xADB5, 0xADB5, 0xBDF7, 0xC618, 0x9472, 0x0000, 0x0000, 0x0000, 0x0000, 0x1082, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0210 (528) pixels + 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20E4, 0x20C4, 0x0000, 0x0000, 0x0000, // 0x0220 (544) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x1082, 0x0000, 0x0000, // 0x0230 (560) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x10A2, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0240 (576) pixels +}}; +} +} diff --git a/src/icons/settings.h b/src/icons/settings.h new file mode 100644 index 0000000..4b01f2a --- /dev/null +++ b/src/icons/settings.h @@ -0,0 +1,46 @@ +#pragma once + +#include "icon.h" + +namespace { +namespace icons { +const Icon<24, 24> settings{{ + 0x83F0, 0x83F0, 0xC638, 0x3186, 0x39A6, 0x9492, 0xBDB6, 0xBDB6, 0xBDB6, 0x1082, 0x1082, 0x1082, 0x1082, 0x1082, 0x736E, 0x6B6E, // 0x0010 (16) pixels + 0x6B2D, 0x6B2D, 0x6B2D, 0x9CB3, 0x9CB3, 0x9CB3, 0x9CB3, 0x9CB3, 0x83F0, 0x83F0, 0xC638, 0x3186, 0x39A6, 0x9492, 0xBDB6, 0xBDB6, // 0x0020 (32) pixels + 0xBDB6, 0x1082, 0x1082, 0x1082, 0x1082, 0x1082, 0x736E, 0x6B6E, 0xA514, 0xA514, 0xA514, 0x9CB3, 0x9CB3, 0x9CB3, 0x9CB3, 0x9CB3, // 0x0030 (48) pixels + 0x5269, 0x5269, 0xF7BE, 0xD6DB, 0x39A6, 0x9492, 0xBDB6, 0xBDB6, 0xBDB6, 0x1082, 0x1082, 0x1082, 0x1082, 0x1082, 0x736E, 0xDEDB, // 0x0040 (64) pixels + 0xE71C, 0xC638, 0x9CD3, 0xA514, 0x738E, 0x738E, 0x738E, 0x738E, 0x5269, 0x5269, 0x83EF, 0xF79E, 0xAD35, 0x9492, 0xBDB6, 0xBDB6, // 0x0050 (80) pixels + 0xBDB6, 0xBDB6, 0x1082, 0x1082, 0x1082, 0x1082, 0xEF7D, 0xEF7D, 0xBDF7, 0x630B, 0x8430, 0x83EF, 0x738E, 0x738E, 0x738E, 0x738E, // 0x0060 (96) pixels + 0x5269, 0x5269, 0x83EF, 0x62EB, 0xEF3C, 0xB5B6, 0xBDB6, 0xBDB6, 0xBDB6, 0xBDB6, 0x6B4D, 0x6B4D, 0x6B4D, 0x6B4D, 0xFFFF, 0xFFDF, // 0x0070 (112) pixels + 0xD69A, 0x9471, 0x8430, 0x94B2, 0x9CB2, 0x9CB2, 0x9CB2, 0x9CB2, 0x5269, 0x5269, 0x83EF, 0x62EB, 0x20A2, 0xE71C, 0xB575, 0xB575, // 0x0080 (128) pixels + 0xAD75, 0xAD55, 0x73AF, 0x73AF, 0x73AF, 0x73AF, 0xFFFF, 0xF7BE, 0xDEDA, 0xA514, 0x9CD3, 0xD69A, 0x840F, 0x840F, 0x840F, 0x840F, // 0x0090 (144) pixels + 0x5269, 0x5269, 0x83EF, 0x62EB, 0x20A2, 0x3103, 0xE71C, 0xB575, 0xAD75, 0xAD55, 0xEBF0, 0x8410, 0x8410, 0x8410, 0xF79E, 0x8410, // 0x00A0 (160) pixels + 0x6B2D, 0xE71C, 0xD69A, 0xB596, 0x6B2D, 0x6B2D, 0x6B2D, 0x6B2D, 0x5269, 0x5269, 0x83EF, 0x62EB, 0x20A2, 0x3103, 0x3103, 0xE71C, // 0x00B0 (176) pixels + 0xAD75, 0xAD55, 0xEBF0, 0xA32F, 0x0298, 0x7BF2, 0xCE39, 0xD6BB, 0x8431, 0xEF5D, 0xE73C, 0x738E, 0x6B2D, 0x6B2D, 0x6B2D, 0x6B2D, // 0x00C0 (192) pixels + 0x5269, 0x5269, 0x83EF, 0x62EB, 0x20A2, 0x3103, 0x3103, 0x6B2C, 0xE71C, 0xAD55, 0xEBF0, 0xA32F, 0x0198, 0x0B1A, 0x8D18, 0xBDB6, // 0x00D0 (208) pixels + 0x7C11, 0x7BF0, 0x8C51, 0x738E, 0x6B2D, 0x6B2D, 0x6B2D, 0x6B2D, 0x5269, 0x5269, 0x83EF, 0x62EB, 0x20A2, 0x3103, 0x3103, 0x6B2C, // 0x00E0 (224) pixels + 0x736D, 0xEF5C, 0xEBCF, 0x826D, 0xD0E3, 0x031B, 0x025A, 0x4A6D, 0x6B2D, 0x7BF0, 0x8C51, 0x738E, 0x6B2D, 0x6B2D, 0x6B2D, 0x6B2D, // 0x00F0 (240) pixels + 0x5269, 0x5269, 0x83EF, 0x62EB, 0x20A2, 0x3103, 0x3103, 0x6B2C, 0x736D, 0x9125, 0xFFDF, 0xF534, 0xC903, 0xD103, 0x0197, 0x632D, // 0x0100 (256) pixels + 0x6B2D, 0x7BF0, 0x8C51, 0x738E, 0x6B2D, 0x6B2D, 0x6B2D, 0x6B2D, 0x2BD8, 0x2BD8, 0x447A, 0x4457, 0x4C97, 0x5CD8, 0x6D5A, 0x5D1A, // 0x0110 (272) pixels + 0x2CBA, 0x6A0F, 0xE289, 0xEB6D, 0xEBAE, 0xD185, 0x90A2, 0xC000, 0xC000, 0xB000, 0xB840, 0xC060, 0xD122, 0xDA04, 0xDA04, 0xDA04, // 0x0120 (288) pixels + 0x2BD8, 0x2BD8, 0x447A, 0x4457, 0x4C97, 0x5CD8, 0x6D5A, 0x5D1A, 0x13DA, 0x3888, 0xA8C3, 0xC944, 0xF575, 0xE269, 0xB0C3, 0xA0A2, // 0x0130 (304) pixels + 0xC000, 0xB000, 0xB840, 0xC060, 0xD122, 0xDA04, 0xDA04, 0xDA04, 0x2BD8, 0x2BD8, 0x447A, 0x4457, 0x4C97, 0x5CD8, 0x6D5A, 0x3C3A, // 0x0140 (320) pixels + 0x01D6, 0x025B, 0x7271, 0xC0E3, 0xB0C2, 0xEBCF, 0xEBEF, 0xA0C3, 0x98A2, 0xB000, 0xB840, 0xC060, 0xD122, 0xDA04, 0xDA04, 0xDA04, // 0x0150 (336) pixels + 0x2BD8, 0x2BD8, 0x447A, 0x4457, 0x4C97, 0x5CD8, 0x4C79, 0x0A57, 0x0177, 0x249F, 0x14FF, 0x4108, 0xB8C3, 0xB0C3, 0xF5D7, 0xECB2, // 0x0160 (352) pixels + 0x98A2, 0x8082, 0x98A2, 0xC060, 0xD122, 0xDA04, 0xDA04, 0xDA04, 0x2BD8, 0x2BD8, 0x447A, 0x4457, 0x4C97, 0x3BD8, 0x1276, 0x0135, // 0x0170 (368) pixels + 0x243E, 0x34BE, 0x0299, 0x514A, 0xD061, 0xA0C3, 0xA8C3, 0xF69A, 0xF555, 0x98A2, 0x8082, 0x98A2, 0xD122, 0xDA04, 0xDA04, 0xDA04, // 0x0180 (384) pixels + 0x2BD8, 0x2BD8, 0x447A, 0x4457, 0x3397, 0x1277, 0x0114, 0x13DE, 0x3D1E, 0x02B8, 0x0379, 0x514A, 0xD061, 0xC800, 0xA0A2, 0xB924, // 0x0190 (400) pixels + 0xFEDB, 0xF5B6, 0x98A2, 0x8082, 0xB143, 0xDA04, 0xDA04, 0xDA04, 0x2BD8, 0x2BD8, 0x447A, 0x2B77, 0x12D8, 0x00F4, 0x135C, 0x453F, // 0x01A0 (416) pixels + 0x0AF9, 0x13B8, 0x0379, 0x514A, 0xB000, 0xB000, 0x90A2, 0xA0C3, 0xC145, 0xFEDB, 0xF5D7, 0x98A2, 0x98A2, 0xC205, 0xDA04, 0xDA04, // 0x01B0 (432) pixels + 0x2BD8, 0x2BD8, 0x237A, 0x3C7E, 0x1B3B, 0x131C, 0x44FF, 0x1B5A, 0x23F9, 0x13B8, 0x0860, 0x0881, 0x0081, 0xB000, 0xB000, 0x90A2, // 0x01C0 (448) pixels + 0xB0C3, 0xC965, 0xFEDB, 0xF596, 0xA0C3, 0xA8C3, 0xEA06, 0xEA06, 0x2BD8, 0x12D8, 0x1B7C, 0x0AFC, 0x2C3E, 0x4D3F, 0x1BBD, 0x029A, // 0x01D0 (464) pixels + 0x0B9A, 0x1040, 0x0860, 0x0881, 0x0081, 0x0082, 0x0082, 0xB000, 0x98A2, 0xC0E3, 0xD165, 0xF69A, 0xECB2, 0xC986, 0xD227, 0xEA06, // 0x01E0 (480) pixels + 0x122E, 0x094E, 0x131A, 0x355F, 0x6EFF, 0x137D, 0x0087, 0x0800, 0x0800, 0x1040, 0x0860, 0x0881, 0x0081, 0x0082, 0x0082, 0x0082, // 0x01F0 (496) pixels + 0x0042, 0x6061, 0xB8C3, 0xC924, 0xFF3C, 0xF596, 0xEA06, 0xEA06, 0x122E, 0x122E, 0x08C8, 0x2318, 0x2318, 0x0886, 0x0000, 0x0800, // 0x0200 (512) pixels + 0x0800, 0x1040, 0x0860, 0x0881, 0x0081, 0x0082, 0x0082, 0x0082, 0x0042, 0x0022, 0x1800, 0xB8C3, 0xE228, 0x3820, 0x5841, 0x5841, // 0x0210 (528) pixels + 0x122E, 0x122E, 0x1969, 0x0000, 0x0000, 0x0800, 0x0800, 0x0800, 0x0800, 0x0820, 0x0820, 0x0840, 0x0061, 0x0061, 0x0041, 0x0041, // 0x0220 (544) pixels + 0x0041, 0x0042, 0x0000, 0x0000, 0x0000, 0x5841, 0x5841, 0x5841, 0x122E, 0x122E, 0x1969, 0x0000, 0x0000, 0x0800, 0x0800, 0x0800, // 0x0230 (560) pixels + 0x0800, 0x0820, 0x0820, 0x0840, 0x0061, 0x0061, 0x0041, 0x0041, 0x0041, 0x0042, 0x0800, 0x0800, 0x0000, 0x5841, 0x5841, 0x5841, // 0x0240 (576) pixels +}}; +} +} diff --git a/src/icons/unchecked.h b/src/icons/unchecked.h new file mode 100644 index 0000000..afa1e99 --- /dev/null +++ b/src/icons/unchecked.h @@ -0,0 +1,46 @@ +#pragma once + +#include "icon.h" + +namespace { +namespace icons { +const Icon<24, 24> unchecked{{ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0010 (16) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0020 (32) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0030 (48) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0040 (64) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2945, 0x6B4D, 0x5AEB, 0x5AEB, // 0x0050 (80) pixels + 0x5AEB, 0x5AEB, 0x5AEB, 0x5AEB, 0x2124, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0060 (96) pixels + 0x0000, 0x0000, 0xA514, 0xA534, 0xA534, 0xBDD7, 0xBDF7, 0xBDF7, 0xBDF7, 0xBDF7, 0xBDD7, 0xB5B6, 0xB5B6, 0x31A6, 0x31A6, 0x39E7, // 0x0070 (112) pixels + 0x0180, 0x0000, 0x11E3, 0x4269, 0x4229, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC618, 0xBDD7, 0xCE59, 0xAD75, 0xB596, 0xB596, // 0x0080 (128) pixels + 0xB596, 0xB596, 0xAD75, 0xAD55, 0xA514, 0xA514, 0xA514, 0xA514, 0xA514, 0x8C71, 0x8C51, 0x5B0C, 0x4AC9, 0x0000, 0x0000, 0x0000, // 0x0090 (144) pixels + 0x0000, 0x8431, 0xA534, 0xA514, 0xA534, 0xAD75, 0xAD75, 0xAD75, 0xAD75, 0xAD75, 0xAD75, 0xAD75, 0xAD75, 0xAD75, 0xAD75, 0xAD75, // 0x00A0 (160) pixels + 0xB596, 0x8C71, 0x8431, 0x5BCC, 0x2A85, 0x52AC, 0x0000, 0x0000, 0x0000, 0x8C51, 0xFFFF, 0x9492, 0xC638, 0xF7BE, 0xFFDF, 0xFFDF, // 0x00B0 (176) pixels + 0xF7BE, 0xF7BE, 0xFFDF, 0xF7BE, 0xF7DE, 0xF7BE, 0xFFDF, 0xFFDF, 0xFFFF, 0x8C51, 0x6B6E, 0x538A, 0x2A85, 0x528C, 0x0000, 0x0000, // 0x00C0 (192) pixels + 0x5ACB, 0x52AA, 0xFFFF, 0x8451, 0xC638, 0xF7BE, 0xF7BE, 0xF7BE, 0xF79E, 0xF79E, 0xF79E, 0xF7BE, 0xF7BE, 0xF79E, 0xF7BE, 0xF7BE, // 0x00D0 (208) pixels + 0xFFDF, 0x8C51, 0x6B6E, 0x53AA, 0x2284, 0x52AC, 0x0000, 0x0000, 0xEF7D, 0xFFFF, 0xEF5D, 0x632D, 0xBDF7, 0xF7BE, 0xF7BE, 0xF79E, // 0x00E0 (224) pixels + 0xF7BE, 0xF7BE, 0xF7BE, 0xF7BE, 0xF7BE, 0xF79E, 0xF7BE, 0xF7BE, 0xFFDF, 0x8431, 0x6B6E, 0x4B0A, 0x52CB, 0x528C, 0x0000, 0x0000, // 0x00F0 (240) pixels + 0xF7BE, 0xE73C, 0x8CD1, 0x738E, 0xBDF7, 0xF7BE, 0xF7BE, 0xF7BE, 0xF7BE, 0xF7BE, 0xF7BE, 0xF7BE, 0xF7BE, 0xF7BE, 0xF7BE, 0xF7BE, // 0x0100 (256) pixels + 0xFFDF, 0x8431, 0x6B6E, 0x5B0C, 0x5ACC, 0x39C8, 0x0000, 0x0000, 0xF7BE, 0xF79E, 0xB616, 0x73CF, 0xC638, 0xFFDF, 0xF79E, 0xF7BE, // 0x0110 (272) pixels + 0xF7BE, 0xF7BE, 0xF7BE, 0xF7BE, 0xF79E, 0xF7BE, 0xFFDF, 0xF7BE, 0xFFDF, 0x8431, 0x6B6E, 0x630D, 0x5AED, 0x0000, 0x0000, 0x0000, // 0x0120 (288) pixels + 0xF79E, 0xFFFF, 0x8CD1, 0x52CB, 0xC618, 0xF7BE, 0xF7BE, 0xF7BE, 0xF7BE, 0xF79E, 0xF7BE, 0xF7BE, 0xF7BE, 0xF7BE, 0xF7BE, 0xF7BE, // 0x0130 (304) pixels + 0xFFDF, 0x8431, 0x6B6E, 0x5AEC, 0x52AC, 0x0000, 0x0000, 0x0000, 0x10A2, 0xBDF7, 0x634B, 0x4A4A, 0xC618, 0xF7DE, 0xF7BE, 0xF7BE, // 0x0140 (320) pixels + 0xF7BE, 0xF7BE, 0xF7BE, 0xF7BE, 0xF7BE, 0xF7BE, 0xF7BE, 0xF7BE, 0xFFFF, 0x8C51, 0x6B6E, 0x7BCF, 0x5AED, 0x0000, 0x0000, 0x0000, // 0x0150 (336) pixels + 0x0000, 0x0000, 0x528C, 0x4A6A, 0xC618, 0xF7BE, 0xF7BE, 0xF7BE, 0xF7DF, 0xF7BE, 0xF7BE, 0xF7BE, 0xF7BE, 0xF7BE, 0xF79E, 0xF7BE, // 0x0160 (352) pixels + 0xFFDF, 0x8431, 0x6B6E, 0x7BCF, 0x5AED, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5ACD, 0x4A4A, 0xBDF8, 0xF7BE, 0xF7BE, 0xF7BE, // 0x0170 (368) pixels + 0xF7BE, 0xF7BE, 0xF7BE, 0xF7BE, 0xF7BE, 0xF7BE, 0xF7BE, 0xF7BE, 0xFFFF, 0x8C51, 0x738E, 0x73AE, 0x632E, 0x0000, 0x0000, 0x0000, // 0x0180 (384) pixels + 0x0000, 0x0000, 0x6B6D, 0x4209, 0xC618, 0xFFDF, 0xF7BE, 0xF7BE, 0xF7BE, 0xF7BE, 0xF7BE, 0xF7BE, 0xF7BE, 0xF7BE, 0xFFDF, 0xF7BE, // 0x0190 (400) pixels + 0xFFDF, 0x8C51, 0x73AF, 0x738F, 0x73AE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6B4C, 0x4A6A, 0xC638, 0xFFFF, 0xFFFF, 0xF7BE, // 0x01A0 (416) pixels + 0xFFDF, 0xFFDF, 0xF7BE, 0xFFDF, 0xF7BE, 0xF7BE, 0xFFDF, 0xF7BE, 0xFFFF, 0x8C51, 0x7BCF, 0x7BF1, 0x738D, 0x0000, 0x0000, 0x0000, // 0x01B0 (432) pixels + 0x0000, 0x0000, 0x6B4C, 0x5ACB, 0xC638, 0xFFFF, 0xFFFF, 0xFFDF, 0xF7BE, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, // 0x01C0 (448) pixels + 0xFFFF, 0x8C72, 0x7BF0, 0x8C53, 0x738D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9492, 0x738E, 0xA534, 0xCE59, 0xCE59, 0xCE59, // 0x01D0 (464) pixels + 0xCE59, 0xC638, 0xC618, 0xCE59, 0xCE59, 0xCE59, 0xCE59, 0xCE59, 0xC638, 0x8C51, 0x8410, 0x8430, 0x7BD0, 0x0000, 0x0000, 0x0000, // 0x01E0 (480) pixels + 0x0000, 0x0000, 0x8C51, 0x8431, 0x7BF0, 0x7BF0, 0x7BF0, 0x7BF0, 0x7BF0, 0x7BF0, 0x7BF0, 0x7BF0, 0x7BF0, 0x7BF0, 0x7BF0, 0x7BF0, // 0x01F0 (496) pixels + 0x7BF0, 0x8410, 0x8C51, 0x8431, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9CD3, 0x9492, 0xB593, 0x9493, 0x9491, 0x94B1, // 0x0200 (512) pixels + 0x94B1, 0x94B1, 0x94B1, 0x94B1, 0x94B1, 0x94B1, 0x94B1, 0x9491, 0x9CF3, 0x4200, 0x8430, 0x9492, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0210 (528) pixels + 0x0000, 0x0020, 0x0000, 0x630D, 0x8C71, 0x8C51, 0x8C51, 0x8C51, 0x8C51, 0x8C51, 0x8C51, 0x8C51, 0x8C51, 0x8C51, 0x8C51, 0x8C51, // 0x0220 (544) pixels + 0x8C71, 0x8410, 0x8C51, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0230 (560) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0240 (576) pixels +}}; +} +} diff --git a/src/icons/wifi.h b/src/icons/wifi.h new file mode 100644 index 0000000..ec94b36 --- /dev/null +++ b/src/icons/wifi.h @@ -0,0 +1,46 @@ +#pragma once + +#include "icon.h" + +namespace { +namespace icons { +const Icon<24, 24> wifi{{ + 0x0000, 0x400C, 0xD000, 0x3BD6, 0x23D5, 0x001F, 0x3396, 0x955F, 0x753D, 0x669C, 0x7C1D, 0x6CFA, 0x6CFA, 0x7C1D, 0x669C, 0x753D, // 0x0010 (16) pixels + 0x955F, 0x3396, 0x001F, 0x23D5, 0x3BD6, 0xD000, 0x400C, 0x0000, 0x3333, 0x3B33, 0x3B13, 0x3B54, 0x02FD, 0x5452, 0x3B77, 0x6459, // 0x0020 (32) pixels + 0x753B, 0x755A, 0x6CF9, 0x7539, 0x7539, 0x6CF9, 0x755A, 0x753B, 0x6459, 0x3B77, 0x5452, 0x02FD, 0x3B54, 0x3B13, 0x3B33, 0x3333, // 0x0030 (48) pixels + 0x3332, 0x2B51, 0x3B35, 0x4B57, 0x0013, 0x4BD7, 0x5C57, 0x6CD9, 0x74FB, 0x6D3A, 0x6D19, 0x7519, 0x7519, 0x6D19, 0x6D3A, 0x74FB, // 0x0040 (64) pixels + 0x6CD9, 0x5C57, 0x4BD7, 0x0013, 0x4B57, 0x3B35, 0x2B51, 0x3332, 0x3B54, 0x3314, 0x3BB2, 0xFCBF, 0x4BF7, 0x4BD6, 0x7CF9, 0x751A, // 0x0050 (80) pixels + 0x6CD9, 0x74F9, 0x74F9, 0x74FA, 0x74FA, 0x74F9, 0x74F9, 0x6CD9, 0x751A, 0x7CF9, 0x4BD6, 0x4BF7, 0xFCBF, 0x3BB2, 0x3314, 0x3B54, // 0x0060 (96) pixels + 0x2AD4, 0x32F4, 0x11B3, 0x7CB9, 0x4BB6, 0x6498, 0x751A, 0x64B9, 0x64B9, 0x74F9, 0x753A, 0x753B, 0x753B, 0x753A, 0x74F9, 0x64B9, // 0x0070 (112) pixels + 0x64B9, 0x751A, 0x6498, 0x4BB6, 0x7CB9, 0x11B3, 0x32F4, 0x2AD4, 0x3335, 0x3315, 0x5638, 0x6458, 0x4BF7, 0x6CB9, 0x6CDA, 0x5C58, // 0x0080 (128) pixels + 0x6CF9, 0x751A, 0x5BF3, 0x428A, 0x426A, 0x6C34, 0x751A, 0x6CF9, 0x5C58, 0x6CDA, 0x6CB9, 0x4BF7, 0x6458, 0x5638, 0x3315, 0x3335, // 0x0090 (144) pixels + 0x3314, 0x3334, 0x753A, 0x5C98, 0x53D6, 0x7519, 0x6CD9, 0x5C57, 0x74F9, 0x6CB8, 0xBDD7, 0xFFFF, 0xEF7D, 0x7BEF, 0x6CD8, 0x74F9, // 0x00A0 (160) pixels + 0x5C57, 0x6CD9, 0x7519, 0x53D6, 0x5C98, 0x753A, 0x3334, 0x3314, 0x3314, 0x3B54, 0x755A, 0x6478, 0x5417, 0x751A, 0x6CD9, 0x5C57, // 0x00B0 (176) pixels + 0x751A, 0x6C97, 0xBDF7, 0xFFDF, 0xEF7D, 0xAD74, 0x6C97, 0x751A, 0x5C57, 0x6CD9, 0x751A, 0x5417, 0x6478, 0x755A, 0x3B54, 0x3314, // 0x00C0 (192) pixels + 0x3334, 0x3B75, 0x751A, 0x6498, 0x5417, 0x74FA, 0x6CD9, 0x5C37, 0x751A, 0x74D8, 0x73EF, 0xD6BA, 0xCE99, 0x73AF, 0x74D8, 0x751A, // 0x00D0 (208) pixels + 0x5C37, 0x6CD9, 0x74FA, 0x5417, 0x6498, 0x751A, 0x3B75, 0x3334, 0x3334, 0x4375, 0x6CF9, 0x6CB8, 0x4BF6, 0x6CF9, 0x74F9, 0x5417, // 0x00E0 (224) pixels + 0x6CD9, 0x74F9, 0x84B4, 0x5B0C, 0x5B0D, 0x84B4, 0x74F9, 0x6CD9, 0x5417, 0x74F9, 0x6CF9, 0x4BF6, 0x6CB8, 0x6CF9, 0x4375, 0x3334, // 0x00F0 (240) pixels + 0x2B13, 0x3334, 0x6C99, 0x6CD9, 0x4BD6, 0x6CB9, 0x751A, 0x5C78, 0x4BF7, 0x8CD5, 0xC67B, 0x7CF8, 0x7CF7, 0xC67B, 0x8CD5, 0x4BF7, // 0x0100 (256) pixels + 0x5C78, 0x751A, 0x6CB9, 0x4BD6, 0x6CD9, 0x6C99, 0x3334, 0x2B13, 0x3354, 0x3314, 0x5C37, 0x74FA, 0x5C37, 0x4BD6, 0x751A, 0x751A, // 0x0110 (272) pixels + 0x5C36, 0x4BB4, 0x84D5, 0x6CB7, 0x6CD8, 0x8CF6, 0x4BB4, 0x5C36, 0x751A, 0x751A, 0x4BD6, 0x5C37, 0x74FA, 0x5C37, 0x3314, 0x3354, // 0x0120 (288) pixels + 0x3314, 0x2AF4, 0x3B54, 0x751A, 0x7D3A, 0x43B6, 0x53F7, 0x6CFA, 0x94D3, 0xEF7E, 0x5BD3, 0x4B73, 0x5393, 0x4B51, 0xEF7E, 0x94B3, // 0x0130 (304) pixels + 0x6CFA, 0x53F7, 0x43B6, 0x7D3A, 0x751A, 0x3B54, 0x2AF4, 0x3314, 0x3B97, 0x3355, 0x3334, 0x43B6, 0x7519, 0x753A, 0x43D6, 0x53B3, // 0x0140 (320) pixels + 0xE73C, 0xBE17, 0x7C53, 0x8CF5, 0x94D2, 0x9CF3, 0xE75C, 0xE73C, 0x53D3, 0x43D6, 0x753A, 0x7519, 0x43B6, 0x3334, 0x3355, 0x3B97, // 0x0150 (336) pixels + 0x0000, 0x2AF4, 0x4374, 0x3334, 0x53F6, 0x751A, 0x6CD9, 0xB5B7, 0xEF7D, 0x7C31, 0x5437, 0x7C72, 0xCE99, 0xF79E, 0xAD54, 0xEF5D, // 0x0160 (352) pixels + 0xB5B7, 0x6CD9, 0x751A, 0x53F6, 0x3334, 0x4374, 0x2AF4, 0x0000, 0x0000, 0x0000, 0x3334, 0x3355, 0x3334, 0x53F6, 0x84D6, 0xDEDB, // 0x0170 (368) pixels + 0xA554, 0x94D3, 0xBE17, 0xF79E, 0xD6BA, 0x7C31, 0x7433, 0xAD54, 0xDEDB, 0x84D6, 0x53F6, 0x3334, 0x3355, 0x3334, 0x0000, 0x0000, // 0x0180 (384) pixels + 0x0000, 0x0000, 0x0000, 0x3334, 0x3332, 0x02D5, 0x9D14, 0xEF7D, 0xD6BA, 0xDEFB, 0xCE79, 0x8CB3, 0x7454, 0x751A, 0x757C, 0x94D2, // 0x0190 (400) pixels + 0xE71B, 0x9D14, 0x02D5, 0x3332, 0x3334, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x63D3, 0x7C30, 0x634C, 0xDEDB, 0xE71C, // 0x01A0 (416) pixels + 0xA554, 0x8C50, 0x5BB1, 0x43F6, 0x3C18, 0x4BF7, 0x4396, 0x5393, 0xBE17, 0xDEDA, 0x634C, 0x7C30, 0x63D3, 0x0000, 0x0000, 0x0000, // 0x01B0 (432) pixels + 0x0000, 0x0000, 0x0000, 0xC617, 0xE73C, 0xA534, 0xF7DE, 0xDEFB, 0xF7BE, 0xF79E, 0xDEDB, 0xC617, 0xAD75, 0x9D14, 0x94B3, 0x94D2, // 0x01C0 (448) pixels + 0x8450, 0xF79E, 0xA534, 0xDF1B, 0x8430, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0x73AE, 0xEF7D, 0xB5B6, 0x6B6C, // 0x01D0 (464) pixels + 0x7BEE, 0x9CF3, 0xB5B6, 0xC638, 0xCE99, 0xDEFB, 0xDEFB, 0xDEDA, 0xD6BA, 0xDEDA, 0xEF5D, 0x73CE, 0xB595, 0x0000, 0x0000, 0x0000, // 0x01E0 (480) pixels + 0x0000, 0x0000, 0x0000, 0x52AA, 0xCE58, 0xE73C, 0x840F, 0x0000, 0x2124, 0x39C7, 0x4A89, 0x5289, 0x630B, 0x7BEF, 0x9491, 0x9CD2, // 0x01F0 (496) pixels + 0x9CF3, 0x9CF3, 0xDEFB, 0xCE58, 0x52A9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8430, 0x7C0F, 0xC617, 0x9CD2, 0x73AD, 0x0000, // 0x0200 (512) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7BEE, 0x94D2, 0xBDF7, 0x8430, 0x8C51, 0x0000, 0x0000, // 0x0210 (528) pixels + 0x0000, 0x0000, 0x8C50, 0x8C50, 0x6B6D, 0x7BEF, 0xC637, 0x2124, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0220 (544) pixels + 0x634C, 0x9D13, 0x7BEF, 0x738D, 0x8C50, 0x8C50, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C50, 0x8C50, 0x8430, 0x8430, 0x0000, 0x0000, // 0x0230 (560) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8430, 0x8430, 0x8C50, 0x8C50, 0x0000, 0x0000, // 0x0240 (576) pixels +}}; +} +} diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..808f88a --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,154 @@ +#include +#include +#include +#include + +#include "bobbycar-protocol/protocol.h" + +#include "globals.h" +#include "modes/defaultmode.h" +#include "modes/tempomatmode.h" +#include "screens.h" +#include "dpad.h" +#include "rotary.h" +#include "serialhandler.h" +#include "ota.h" +#include "presets.h" +#include "statistics.h" +#include "actions/bluetoothbeginmasteraction.h" +#include "actions/bluetoothconnectbmsaction.h" + +namespace { +ModeInterface *lastMode{}; +unsigned long lastModeUpdate{}; +unsigned long lastStatsUpdate{}; +unsigned long lastDisplayRedraw{}; + +constexpr auto modeUpdateRate = 50; +constexpr auto statsUpdateRate = 50; +constexpr auto displayRedrawRate = 50; +} + +void setup() +{ + Serial.begin(115200); + Serial.setDebugOutput(true); + Serial.println("setup()"); + pinMode(3, INPUT_PULLUP); + + currentlyReverseBeeping = false; + + initScreen(); + +#ifdef FEATURE_3WIRESW + dpad.begin(); +#endif + +#ifdef FEATURE_ROTARY + initRotary(); +#endif + + settings = presets::defaultSettings; + + if (settingsSaver.init()) + loadSettings(); + + updateSwapFrontBack(); + + WiFi.mode(WIFI_AP_STA); + WiFi.softAP("bobbyquad", "Passwort_123"); + WiFi.begin("realraum", "r3alraum"); + //WiFi.begin("McDonalds Free WiFi 2.4GHz", "Passwort_123"); + + BluetoothBeginMasterAction{}.triggered(); + if (settings.autoConnectBms) + BluetoothConnectBmsAction{}.triggered(); + + front.serial.get().begin(38400, SERIAL_8N1, PINS_RX1, PINS_TX1); + back.serial.get().begin(38400, SERIAL_8N1, PINS_RX2, PINS_TX2); + + raw_gas = 0; + raw_brems = 0; + gas = 0; + brems = 0; + + for (Controller &controller : controllers()) + controller.command.buzzer = {}; + + currentMode = &modes::defaultMode; + + initOta(); + + readPotis(); + + if (gas > 200.f || brems > 200.f) + switchScreen(true); + else + switchScreen(); +} + +void loop() +{ + const auto now = millis(); + +#ifdef FEATURE_3WIRESW + updateDpad(); +#endif + + if (!lastModeUpdate) + lastModeUpdate = now; + else if (now - lastModeUpdate >= 1000/modeUpdateRate) + { + readPotis(); + + if (lastMode != currentMode) + { + if (lastMode) + lastMode->stop(); + lastMode = currentMode; + if (currentMode) + currentMode->start(); + } + + if (currentMode) + currentMode->update(); + + lastModeUpdate = now; + + performance.current++; + } + + if (!lastStatsUpdate) + lastStatsUpdate = now; + else if (now - lastStatsUpdate >= 1000/statsUpdateRate) + { + updateAccumulators(); + pushStats(); + lastStatsUpdate = now; + } + + updateDisplay(); + + if (!lastDisplayRedraw || now - lastDisplayRedraw >= 1000/displayRedrawRate) + { + redrawDisplay(); + + lastDisplayRedraw = now; + } + + if (now - performance.lastTime >= 1000) + { + performance.last = performance.current; + performance.current = 0; + performance.lastTime = now; + } + + for (Controller &controller : controllers()) + controller.parser.update(); + + handleSerial(); + + handleOta(); + + bms::update(); +} diff --git a/src/menudefinitioninterface.h b/src/menudefinitioninterface.h new file mode 100644 index 0000000..e86a6ab --- /dev/null +++ b/src/menudefinitioninterface.h @@ -0,0 +1,13 @@ +#pragma once + +#include + +#include "menuitem.h" + +namespace { +class MenuDefinitionInterface +{ +public: + virtual void runForEveryMenuItem(std::function &&callback) = 0; +}; +} diff --git a/src/menudisplay.h b/src/menudisplay.h new file mode 100644 index 0000000..a7e526d --- /dev/null +++ b/src/menudisplay.h @@ -0,0 +1,255 @@ +#pragma once + +#include +#include +#include + +#include "display.h" +#include "textinterface.h" +#include "widgets/label.h" +#include "globals.h" +#include "menudefinitioninterface.h" +#include "menuitem.h" + +namespace { +class MenuDisplay : public Display, public virtual TextInterface, public virtual MenuDefinitionInterface +{ +public: + void start() override; + void initScreen() override; + void update() override; + void redraw() override; + void stop() override; + + void rotate(int offset) override; + void button() override; + + virtual void itemPressed(int index); + + MenuDisplay *asMenuDisplay() override { return this; } + const MenuDisplay *asMenuDisplay() const override { return this; } + + int selectedIndex() const { return m_selectedIndex; } + +protected: + void setSelectedIndex(int selectedIndex) { m_selectedIndex = selectedIndex; } + +private: + Label m_titleLabel{5, 5}; // 230, 25 + + static constexpr auto iconWidth = 25; + static constexpr auto horizontalSpacing = 10; + static constexpr auto topMargin = 40; + static constexpr auto lineHeight = 25; + static constexpr auto verticalSpacing = 3; + + std::array m_labels {{ + Label{horizontalSpacing + iconWidth, topMargin+(0*(lineHeight+verticalSpacing))}, // 240-(horizontalSpacing*2)-iconWidth, lineHeight + Label{horizontalSpacing + iconWidth, topMargin+(1*(lineHeight+verticalSpacing))}, // 240-(horizontalSpacing*2)-iconWidth, lineHeight + Label{horizontalSpacing + iconWidth, topMargin+(2*(lineHeight+verticalSpacing))}, // 240-(horizontalSpacing*2)-iconWidth, lineHeight + Label{horizontalSpacing + iconWidth, topMargin+(3*(lineHeight+verticalSpacing))}, // 240-(horizontalSpacing*2)-iconWidth, lineHeight + Label{horizontalSpacing + iconWidth, topMargin+(4*(lineHeight+verticalSpacing))}, // 240-(horizontalSpacing*2)-iconWidth, lineHeight + Label{horizontalSpacing + iconWidth, topMargin+(5*(lineHeight+verticalSpacing))}, // 240-(horizontalSpacing*2)-iconWidth, lineHeight + Label{horizontalSpacing + iconWidth, topMargin+(6*(lineHeight+verticalSpacing))}, // 240-(horizontalSpacing*2)-iconWidth, lineHeight + Label{horizontalSpacing + iconWidth, topMargin+(7*(lineHeight+verticalSpacing))}, // 240-(horizontalSpacing*2)-iconWidth, lineHeight + Label{horizontalSpacing + iconWidth, topMargin+(8*(lineHeight+verticalSpacing))}, // 240-(horizontalSpacing*2)-iconWidth, lineHeight + Label{horizontalSpacing + iconWidth, topMargin+(9*(lineHeight+verticalSpacing))}, // 240-(horizontalSpacing*2)-iconWidth, lineHeight + }}; + + std::array *, 10> m_icons; + + int m_selectedIndex; + int m_scrollOffset; + int m_highlightedIndex; + + int m_rotateOffset; + bool m_pressed; +}; + +void MenuDisplay::start() +{ + m_selectedIndex = 0; + m_scrollOffset = 0; + m_highlightedIndex = -1; + + m_rotateOffset = 0; + m_pressed = false; +} + +void MenuDisplay::initScreen() +{ + tft.fillScreen(TFT_BLACK); + + m_titleLabel.start(); + tft.fillRect(0, 34, tft.width(), 3, TFT_WHITE); + + for (auto &label : m_labels) + label.start(); + + runForEveryMenuItem([](MenuItem &item){ + item.start(); + }); + + m_icons.fill(nullptr); +} + +void MenuDisplay::update() +{ + if (!m_pressed) + { + const auto offset = m_rotateOffset; + m_rotateOffset = 0; + + const auto itemCount = [&](){ + int i{0}; + runForEveryMenuItem([&](MenuItem&){ i++; }); + return i; + }(); + + if (itemCount) + { + if (m_selectedIndex == -1) + m_selectedIndex = 0; + + m_selectedIndex = m_selectedIndex + offset; + + if (m_selectedIndex < 0) + m_selectedIndex = 0; + if (m_selectedIndex >= itemCount) + m_selectedIndex = itemCount - 1; + + if (m_selectedIndex < m_scrollOffset) + m_scrollOffset = m_selectedIndex; + if (m_selectedIndex >= m_scrollOffset + m_labels.size()) + m_scrollOffset = m_selectedIndex - m_labels.size() + 1; + } + else + { + m_selectedIndex = -1; + m_scrollOffset = 0; + } + + runForEveryMenuItem([&](MenuItem &item){ + item.update(); + }); + } + else + { + m_pressed = false; + if (m_selectedIndex >= 0) + itemPressed(m_selectedIndex); + } +} + +void MenuDisplay::redraw() +{ + tft.setTextFont(4); + tft.setTextColor(TFT_YELLOW, TFT_BLACK); + m_titleLabel.redraw(text()); + + int i{0}; + + auto labelsIter = std::begin(m_labels); + + auto iconsIter = std::begin(m_icons); + + int newHighlightedIndex{-1}; + + const auto drawItemRect = [](const auto &label, const auto color){ + tft.drawRect(5, + label.y()-1, + 240 - 10, + lineHeight+2, + color); + }; + + runForEveryMenuItem([&](MenuItem &item){ + const auto index = i++; + + if (index < m_scrollOffset) + return; + + if (labelsIter == std::end(m_labels)) + return; + + const auto relativeIndex = index - m_scrollOffset; + const auto selected = index == m_selectedIndex; + + if (selected) + newHighlightedIndex = relativeIndex; + else if (relativeIndex == m_highlightedIndex) + drawItemRect(*labelsIter, TFT_BLACK); + + tft.setTextFont(item.font()); + tft.setTextColor(item.color(), TFT_BLACK); + labelsIter->redraw(item.text()); + + if (item.icon() != *iconsIter) + { + tft.fillRect(5, labelsIter->y()+1, 24, 24, TFT_BLACK); + + auto icon = item.icon(); + if (icon) + { + tft.setSwapBytes(true); + tft.pushImage(6, labelsIter->y()+1, icon->WIDTH, icon->HEIGHT, icon->buffer); + tft.setSwapBytes(false); + } + *iconsIter = icon; + } + + if (selected && (relativeIndex != m_highlightedIndex)) + { + drawItemRect(*labelsIter, TFT_WHITE); + } + + labelsIter++; + iconsIter++; + }); + + for (; labelsIter != std::end(m_labels); labelsIter++, iconsIter++) + { + const auto relativeIndex = std::distance(std::begin(m_labels), labelsIter); + + if (relativeIndex == m_highlightedIndex) + drawItemRect(*labelsIter, TFT_BLACK); + + labelsIter->clear(); + + if (*iconsIter) + { + tft.fillRect(5, labelsIter->y()+1, 24, 24, TFT_BLACK); + *iconsIter = nullptr; + } + } + + m_highlightedIndex = newHighlightedIndex; +} + +void MenuDisplay::stop() +{ + runForEveryMenuItem([](MenuItem &item){ + item.stop(); + }); +} + +void MenuDisplay::rotate(int offset) +{ + m_rotateOffset += offset; +} + +void MenuDisplay::button() +{ + m_pressed = true; +} + +void MenuDisplay::itemPressed(int index) +{ + int i{0}; + + runForEveryMenuItem([&](MenuItem &item){ + if (i++ == index) + item.triggered(); + }); +} +} diff --git a/src/menuitem.h b/src/menuitem.h new file mode 100644 index 0000000..84eda73 --- /dev/null +++ b/src/menuitem.h @@ -0,0 +1,29 @@ +#pragma once + +#include "textinterface.h" +#include "fontinterface.h" +#include "colorinterface.h" +#include "iconinterface.h" +#include "actioninterface.h" + +namespace { +using MenuItemIconInterface = IconInterface<24, 24>; + +using MenuItemIcon = Icon<24, 24>; + +template +using StaticMenuItemIcon = StaticIcon<24, 24, T>; + +class MenuItem : + public virtual ActionInterface, + public virtual TextInterface, + public virtual FontInterface, + public virtual ColorInterface, + public virtual IconInterface<24, 24> +{ +public: + virtual void start() {} + virtual void update() {} + virtual void stop() {} +}; +} diff --git a/src/modeinterface.h b/src/modeinterface.h new file mode 100644 index 0000000..1d0c97f --- /dev/null +++ b/src/modeinterface.h @@ -0,0 +1,16 @@ +#pragma once + +#include + +namespace { +class ModeInterface { +public: + virtual ~ModeInterface() = default; + + virtual void start() {}; + virtual void update() = 0; + virtual void stop() {}; + + virtual const char *displayName() const = 0; +}; +} diff --git a/src/modes/defaultmode.h b/src/modes/defaultmode.h new file mode 100644 index 0000000..15858b0 --- /dev/null +++ b/src/modes/defaultmode.h @@ -0,0 +1,90 @@ +#pragma once + +#include + +#include + +#include "modeinterface.h" +#include "globals.h" +#include "utils.h" + +namespace { +class DefaultMode : public ModeInterface +{ +public: + void update() override; + + const char *displayName() const override { return "Default"; } + + bool waitForGasLoslass{false}; + bool waitForBremsLoslass{false}; + +private: + unsigned long lastTime{millis()}; + float lastPwm{0}; +}; + +namespace modes { +DefaultMode defaultMode; +} + +void DefaultMode::update() +{ + if (waitForGasLoslass) + { + if (gas < 50) + waitForGasLoslass = false; + else + gas = 0; + } + const auto gas_squared = (gas * gas) / 1000; + + if (waitForBremsLoslass) + { + if (brems < 50) + waitForBremsLoslass = false; + else + brems = 0; + } + const auto brems_squared = (brems * brems) / 1000; + + const auto now = millis(); + + float pwm; + if (gas_squared >= settings.defaultMode.add_schwelle) + { + pwm = (gas_squared/1000.*settings.defaultMode.gas1_wert) + (brems_squared/1000.*settings.defaultMode.brems1_wert); + + if (settings.defaultMode.enableSmoothing && (pwm > 1000. || lastPwm > 1000.)) + { + if (lastPwm < pwm) + { + pwm = std::min(pwm, lastPwm+(settings.defaultMode.smoothing*(now-lastTime)/100.f)); + if (pwm < 1000.) + pwm = 1000.; + } + else if (lastPwm > pwm) + { + pwm = std::max(pwm, lastPwm-(settings.defaultMode.smoothing*(now-lastTime)/100.f)); + } + } + } + else + pwm = (gas_squared/1000.*settings.defaultMode.gas2_wert) - (brems_squared/1000.*settings.defaultMode.brems2_wert); + + lastPwm = pwm; + lastTime = now; + + for (Controller &controller : controllers()) + for (MotorState &motor : motorsInController(controller)) + { + motor.ctrlTyp = settings.defaultMode.ctrlTyp; + motor.ctrlMod = settings.defaultMode.ctrlMod; + motor.pwm = pwm / 100. * (&controller == &front ? settings.defaultMode.frontPercentage : settings.defaultMode.backPercentage); + } + + fixCommonParams(); + + sendCommands(); +} +} diff --git a/src/modes/ignoreinputmode.h b/src/modes/ignoreinputmode.h new file mode 100644 index 0000000..ca5343b --- /dev/null +++ b/src/modes/ignoreinputmode.h @@ -0,0 +1,41 @@ +#pragma once + +#include "modeinterface.h" +#include "globals.h" +#include "utils.h" + +#include "bobbycar-protocol/protocol.h" + +namespace { +class IgnoreInputMode : public ModeInterface +{ +public: + IgnoreInputMode(int16_t pwm, ControlType ctrlTyp, ControlMode ctrlMod) : + m_pwm{pwm}, m_ctrlTyp{ctrlTyp}, m_ctrlMod{ctrlMod} + { + } + + void update() override; + + const char *displayName() const override { return "IgnoreInput"; } + +private: + const int16_t m_pwm; + const ControlType m_ctrlTyp; + const ControlMode m_ctrlMod; +}; + +void IgnoreInputMode::update() +{ + for (MotorState &motor : motors()) + { + motor.ctrlTyp = m_ctrlTyp; + motor.ctrlMod = m_ctrlMod; + motor.pwm = m_pwm; + } + + fixCommonParams(); + + sendCommands(); +} +} diff --git a/src/modes/larsmmode.h b/src/modes/larsmmode.h new file mode 100644 index 0000000..f4161ce --- /dev/null +++ b/src/modes/larsmmode.h @@ -0,0 +1,110 @@ +#pragma once + +#include "modeinterface.h" +#include "globals.h" +#include "utils.h" + +#include "bobbycar-protocol/protocol.h" + +namespace { +class LarsmMode : public ModeInterface +{ +public: + void start() override; + void update() override; + + const char *displayName() const override { return "Larsm"; } + +private: + float adc1_filtered; + float adc2_filtered; + int speed; + float weak; +}; + +namespace modes { +LarsmMode larsmMode; +} + +void LarsmMode::start() +{ + adc1_filtered = 0.f; + adc2_filtered = 0.f; + speed = 0; + weak = 0.f; +} + +void LarsmMode::update() +{ + for (uint8_t i = 0; i < settings.larsmMode.iterations; i++) // run multiple times to emulate higher refreshrate + { + // ####### larsm's bobby car code ####### + + // LOW-PASS FILTER (fliessender Mittelwert) + adc1_filtered = adc1_filtered * 0.9 + gas * 0.1; // ADC1, TX, rechts, vorwaerts, blau + adc2_filtered = adc2_filtered * 0.9 + brems * 0.1; // ADC2, RX, links, rueckwearts, gruen + + // magic numbers die ich nicht mehr nachvollziehen kann, faehrt sich aber gut ;-) + #define LOSLASS_BREMS_ACC 0.996f // naeher an 1 = gemaechlicher + #define DRUECK_ACC2 (1.0f - LOSLASS_BREMS_ACC + 0.001f) // naeher an 0 = gemaechlicher + #define DRUECK_ACC1 (1.0f - LOSLASS_BREMS_ACC + 0.001f) // naeher an 0 = gemaechlicher + //die + 0.001f gleichen float ungenauigkeiten aus. + + #define ADC1_MIN 0 + #define ADC2_MIN 0 + #define ADC1_MAX 1000 + #define ADC2_MAX 1000 + + #define ADC2_DELTA (ADC2_MAX - ADC2_MIN) + #define ADC1_DELTA (ADC1_MAX - ADC1_MIN) + + #define CLAMP(x, low, high) (((x) > (high)) ? (high) : (((x) < (low)) ? (low) : (x))) + + if (settings.larsmMode.mode == LarsmModeMode::Mode1) { // Mode 1, links: 3 kmh + speed = (float)speed * LOSLASS_BREMS_ACC // bremsen wenn kein poti gedrueckt + - (CLAMP(brems - ADC2_MIN, 0, ADC2_DELTA) / (ADC2_DELTA / 280.0f)) * DRUECK_ACC2 // links gedrueckt = zusatzbremsen oder rueckwaertsfahren + + (CLAMP(gas - ADC1_MIN, 0, ADC1_DELTA) / (ADC1_DELTA / 350.0f)) * DRUECK_ACC1; // vorwaerts gedrueckt = beschleunigen 12s: 350=3kmh + weak = 0; + + } else if (settings.larsmMode.mode == LarsmModeMode::Mode2) { // Mode 2, default: 6 kmh + speed = (float)speed * LOSLASS_BREMS_ACC + - (CLAMP(brems - ADC2_MIN, 0, ADC2_DELTA) / (ADC2_DELTA / 310.0f)) * DRUECK_ACC2 + + (CLAMP(gas - ADC1_MIN, 0, ADC1_DELTA) / (ADC1_DELTA / 420.0f)) * DRUECK_ACC1; // 12s: 400=5-6kmh 450=7kmh + weak = 0; + + } else if (settings.larsmMode.mode == LarsmModeMode::Mode3) { // Mode 3, rechts: 12 kmh + speed = (float)speed * LOSLASS_BREMS_ACC + - (CLAMP(brems - ADC2_MIN, 0, ADC2_DELTA) / (ADC2_DELTA / 340.0f)) * DRUECK_ACC2 + + (CLAMP(gas - ADC1_MIN, 0, ADC1_DELTA) / (ADC1_DELTA / 600.0f)) * DRUECK_ACC1; // 12s: 600=12kmh + weak = 0; + + } else if (settings.larsmMode.mode == LarsmModeMode::Mode4) { // Mode 4, l + r: full kmh + // Feldschwaechung wird nur aktiviert wenn man schon sehr schnell ist. So gehts: Rechts voll druecken und warten bis man schnell ist, dann zusaetzlich links schnell voll druecken. + if (adc2_filtered > (ADC2_MAX - 450) && speed > 800) { // field weakening at high speeds + speed = (float)speed * LOSLASS_BREMS_ACC + + (CLAMP(gas - ADC1_MIN, 0, ADC1_DELTA) / (ADC1_DELTA / 1000.0f)) * DRUECK_ACC1; + weak = weak * 0.95 + 400.0 * 0.05; // sanftes hinzuschalten des turbos, 12s: 400=29kmh + } else { //normale fahrt ohne feldschwaechung + speed = (float)speed * LOSLASS_BREMS_ACC + - (CLAMP(brems - ADC2_MIN, 0, ADC2_DELTA) / (ADC2_DELTA / 340.0f)) * DRUECK_ACC2 + + (CLAMP(gas - ADC1_MIN, 0, ADC1_DELTA) / (ADC1_DELTA / 1000.0f)) * DRUECK_ACC1; // 12s: 1000=22kmh + weak = weak * 0.95; // sanftes abschalten des turbos + } + // weak should never exceed 400 or 450 MAX!! + } + + speed = CLAMP(speed, -1000, 1000); // clamp output + } + + for (MotorState &motor : motors()) + { + motor.ctrlTyp = ControlType::Commutation; + motor.ctrlMod = ControlMode::Voltage; + motor.pwm = speed + weak; + } + + fixCommonParams(); + + sendCommands(); +} +} diff --git a/src/modes/tempomatmode.h b/src/modes/tempomatmode.h new file mode 100644 index 0000000..2038f8b --- /dev/null +++ b/src/modes/tempomatmode.h @@ -0,0 +1,57 @@ +#pragma once + +#include + +#include "bobbycar-protocol/protocol.h" + +#include "modeinterface.h" +#include "globals.h" +#include "utils.h" +#include "defaultmode.h" + +namespace { +class TempomatMode : public ModeInterface +{ +public: + void start() override; + void update() override; + + const char *displayName() const override { return "Tempomat"; } + + int16_t pwm; +}; + +namespace modes { +TempomatMode tempomatMode; +} + +void TempomatMode::start() +{ + pwm = 0; +} + +void TempomatMode::update() +{ + if (gas > 500. && brems > 500.) + { + pwm = 0; + modes::defaultMode.waitForGasLoslass = true; + modes::defaultMode.waitForBremsLoslass = true; + currentMode = &modes::defaultMode; + return; + } + + pwm += (gas/1000.) - (brems/1000.); + + for (MotorState &motor : motors()) + { + motor.ctrlTyp = settings.tempomatMode.ctrlTyp; + motor.ctrlMod = settings.tempomatMode.ctrlMod; + motor.pwm = pwm; + } + + fixCommonParams(); + + sendCommands(); +} +} diff --git a/src/ota.h b/src/ota.h new file mode 100644 index 0000000..8b7578f --- /dev/null +++ b/src/ota.h @@ -0,0 +1,45 @@ +#pragma once + +#include + +#include "screens.h" +#include "displays/updatedisplay.h" + +namespace { +void initOta() +{ + ArduinoOTA + .onStart([]() { + String type; + if (ArduinoOTA.getCommand() == U_FLASH) + type = "sketch"; + else if (ArduinoOTA.getCommand() == U_SPIFFS) // U_SPIFFS + type = "filesystem"; + else + type = "unknown"; + + switchScreenImpl("Updating " + type); + }) + .onEnd([]() { + getRefByType().m_finished = true; + getRefByType().redraw(); + }) + .onProgress([](unsigned int progress, unsigned int total) { + getRefByType().m_progress = progress; + getRefByType().m_total = total; + getRefByType().redraw(); + }) + .onError([](ota_error_t error) { + getRefByType().m_error = error; + getRefByType().m_errorValid = true; + getRefByType().redraw(); + }); + + ArduinoOTA.begin(); +} + +void handleOta() +{ + ArduinoOTA.handle(); +} +} diff --git a/src/presets.h b/src/presets.h new file mode 100644 index 0000000..c5c160c --- /dev/null +++ b/src/presets.h @@ -0,0 +1,84 @@ +#pragma once + +#include "settings.h" + +namespace presets { +constexpr Settings::Limits defaultLimits { + .iMotMax = 25, + .iDcMax = 27, + .nMotMax = 1000, + .fieldWeakMax = 5, + .phaseAdvMax = 40 +}; +constexpr Settings::Limits kidsLimits { + .iMotMax = 5, + .iDcMax = 7, + .nMotMax = 500, + .fieldWeakMax = 2, + .phaseAdvMax = 20 +}; + +constexpr Settings::Hardware::Poti defaultPoti { + .sampleCount = 100, + .gasMin = 800, + .gasMax = 3700, + .bremsMin = 1300, + .bremsMax = 4000 +}; + +constexpr Settings::Hardware defaultHardware { + .enableFrontLeft = true, + .enableFrontRight = true, + .enableBackLeft = true, + .enableBackRight = true, + + .invertFrontLeft = false, + .invertFrontRight = true, + .invertBackLeft = false, + .invertBackRight = true, + + .poti = defaultPoti, + + .wheelDiameter = 165, + .numMagnetPoles = 15, + .swapFrontBack = false +}; + +constexpr Settings::DefaultMode defaultDefaultMode { + .ctrlTyp = ControlType::FieldOrientedControl, + .ctrlMod = ControlMode::Torque, + .enableSmoothing = true, + .smoothing = 20, + .frontPercentage = 100, + .backPercentage = 100, + .add_schwelle = 950, + .gas1_wert = 1250, + .gas2_wert = 1250, + .brems1_wert = 250, + .brems2_wert = 750 +}; + +constexpr Settings::TempomatMode defaultTempomatMode { + .ctrlTyp = ControlType::FieldOrientedControl, + .ctrlMod = ControlMode::Speed +}; + +constexpr Settings::LarsmMode defaultLarsmMode { + .mode = LarsmModeMode::Mode4, + .iterations = 5 +}; + +constexpr Settings defaultSettings{ + .autoConnectBms = false, + .reverseBeep = true, + .reverseBeepFreq0 = 3, + .reverseBeepFreq1 = 0, + .reverseBeepDuration0 = 500, + .reverseBeepDuration1 = 500, + .limits = defaultLimits, + .hardware = defaultHardware, + .defaultMode = defaultDefaultMode, + .tempomatMode = defaultTempomatMode, + .larsmMode = defaultLarsmMode +}; +} diff --git a/src/rotary.h b/src/rotary.h new file mode 100644 index 0000000..bf68c6b --- /dev/null +++ b/src/rotary.h @@ -0,0 +1,85 @@ +#pragma once + +#include + +#include "globals.h" + +namespace { +template +class Rotary +{ +public: + static constexpr auto ClkPin = CLK; + static constexpr auto DtPin = DT; + static constexpr auto SwPin = SW; + + void begin(); + + void updateRotate(); + void updateSwitch(); + +private: + int m_lastMillis{}; + + bool m_lastClk; + bool m_lastSw{}; +}; + +template +void Rotary::begin() +{ + m_lastMillis = millis(); + + pinMode(ClkPin, INPUT_PULLUP); + pinMode(DtPin, INPUT_PULLUP); + pinMode(SwPin, INPUT_PULLUP); + + m_lastClk = digitalRead(ClkPin); +} + +template +void Rotary::updateRotate() +{ + const auto now = millis(); + if (now - m_lastMillis < 1) + return; + m_lastMillis = now; + + const bool currentClk = digitalRead(ClkPin); + if (currentClk != m_lastClk) + { + HANDLER::rotate(digitalRead(DtPin) != currentClk ? 1 : -1); + m_lastClk = currentClk; + } +} + +template +void Rotary::updateSwitch() +{ + const auto now = millis(); + if (now - m_lastMillis < 1) + return; + m_lastMillis = now; + + const bool currentSw = !bool(digitalRead(SwPin)); + if (currentSw != m_lastSw) + { + HANDLER::button(currentSw); + m_lastSw = currentSw; + } +} + +#ifdef FEATURE_ROTARY +Rotary rotary; + +void updateRotate() { rotary.updateRotate(); } +void updateSwitch() { rotary.updateSwitch(); } + +void initRotary() +{ + rotary.begin(); + attachInterrupt(decltype(rotary)::ClkPin, updateRotate, CHANGE); + attachInterrupt(decltype(rotary)::SwPin, updateSwitch, CHANGE); +} +#endif +} diff --git a/src/screens.h b/src/screens.h new file mode 100644 index 0000000..ff789d4 --- /dev/null +++ b/src/screens.h @@ -0,0 +1,380 @@ +#pragma once + +#include "displays/menus/aboutmenu.h" +#include "displays/menus/accesspointwifisettingsmenu.h" +#include "displays/menus/bluetoothsettingsmenu.h" +#include "displays/menus/bmsmenu.h" +#include "displays/menus/buzzermenu.h" +#include "displays/menus/commanddebugmenu.h" +#include "displays/menus/debugmenu.h" +#include "displays/menus/defaultmodesettingsmenu.h" +#include "displays/menus/demosmenu.h" +#include "displays/menus/dynamicdebugmenu.h" +#include "displays/menus/enablemenu.h" +#include "displays/menus/feedbackdebugmenu.h" +#include "displays/menus/genericwifisettingsmenu.h" +#include "displays/menus/graphsmenu.h" +#include "displays/menus/hardwaresettingsmenu.h" +#include "displays/menus/invertmenu.h" +#include "displays/menus/larsmmodesettingsmenu.h" +#include "displays/menus/limitssettingsmenu.h" +#include "displays/menus/mainmenu.h" +#include "displays/menus/tempomatmodesettingsmenu.h" +#include "displays/menus/modessettingsmenu.h" +#include "displays/menus/motorfeedbackdebugmenu.h" +#include "displays/menus/motorstatedebugmenu.h" +#include "displays/menus/presetsmenu.h" +#include "displays/menus/potisettingsmenu.h" +#include "displays/menus/selectmodemenu.h" +#include "displays/menus/settingsmenu.h" +#include "displays/menus/stationwifisettingsmenu.h" +#include "displays/menus/wifiscanmenu.h" +#include "displays/menus/wifisettingsmenu.h" +#include "displays/bmsdisplay.h" +#include "displays/calibratedisplay.h" +#include "displays/dualgraphdisplay.h" +#include "displays/gameoflifedisplay.h" +#include "displays/lockscreen.h" +#include "displays/matrixdisplay.h" +#include "displays/metersdisplay.h" +#include "displays/pingpongdisplay.h" +#include "displays/poweroffdisplay.h" +#include "displays/spirodisplay.h" +#include "displays/starfielddisplay.h" +#include "displays/statusdisplay.h" +#include "displays/updatedisplay.h" + +#include "globals.h" +#include "utils.h" +#include "icons/logo.h" + +namespace { +union X { + X() {} + ~X() { ((Display&)statusDisplay).~Display(); } + + AboutMenu aboutMenu; + AccessPointWifiSettingsMenu accessPointWifiSettingsMenu; + BluetoothSettingsMenu bluetoothSettingsMenu; + BmsMenu bmsMenu; + BuzzerMenu buzzerMenu; + FrontCommandDebugMenu frontCommandDebugMenu; + BackCommandDebugMenu backCommandDebugMenu; + DebugMenu debugMenu; + DefaultModeSettingsMenu defaultModeSettingsMenu; + DemosMenu demosMenu; + DynamicDebugMenu dynamicDebugMenu; + EnableMenu enableMenu; + FrontFeedbackDebugMenu frontFeedbackDebugMenu; + BackFeedbackDebugMenu backFeedbackDebugMenu; + GenericWifiSettingsMenu genericWifiSettingsMenu; + GraphsMenu graphsMenu; + HardwareSettingsMenu hardwareSettingsMenu; + InvertMenu invertMenu; + LarsmModeSettingsMenu larsmModeSettingsMenu; + LimitsSettingsMenu limitsSettingsMenu; + MainMenu mainMenu; + TempomatModeSettingsMenu tempomatModeSettingsMenu; + ModesSettingsMenu modesSettingsMenu; + FrontLeftMotorStateDebugMenu frontLeftMotorStateDebugMenu; + FrontRightMotorStateDebugMenu frontRightMotorStateDebugMenu; + BackLeftMotorStateDebugMenu backLeftMotorStateDebugMenu; + BackRightMotorStateDebugMenu backRightMotorStateDebugMenu; + FrontLeftMotorFeedbackDebugMenu frontLeftMotorFeedbackDebugMenu; + FrontRightMotorFeedbackDebugMenu frontRightMotorFeedbackDebugMenu; + BackLeftMotorFeedbackDebugMenu backLeftMotorFeedbackDebugMenu; + BackRightMotorFeedbackDebugMenu backRightMotorFeedbackDebugMenu; + PotiSettingsMenu potiSettingsMenu; + PresetsMenu presetsMenu; + SelectModeMenu selectModeMenu; + SettingsMenu settingsMenu; + StationWifiSettingsMenu stationWifiSettingsMenu; + WifiScanMenu wifiScanMenu; + WifiSettingsMenu wifiSettingsMenu; + + BmsDisplay bmsDisplay; + CalibrateDisplay calibrateDisplay; + DualGraphDisplay dualGraphDisplay; + GameOfLifeDisplay gameOfLifeDisplay; + Lockscreen lockScreen; + MatrixDisplay matrixDisplay; + MetersDisplay metersDisplay; + PingPongDisplay pingPongDisplay; + PoweroffDisplay poweroffDisplay; + SpiroDisplay spiroDisplay; + StarfieldDisplay starFieldDisplay; + StatusDisplay statusDisplay; + UpdateDisplay updateDisplay; + + FrontFreqChangeScreen changeFrontFreq; + FrontPatternChangeScreen changeFrontPattern; + BackFreqChangeScreen changeBackFreq; + BackPatternChangeScreen changeBackPattern; + ReverseBeepFreq0ChangeScreen changeReverseBeepFreq0; + ReverseBeepFreq1ChangeScreen changeReverseBeepFreq1; + ReverseBeepDuration0ChangeScreen changeReverseBeepDuration0; + ReverseBeepDuration1ChangeScreen changeReverseBeepDuration1; + + IMotMaxChangeScreen changeIMotMax; + IDcMaxChangeScreen changeIDcMax; + NMotMaxKmhChangeScreen changeNMotMaxKmh; + NMotMaxRpmChangeScreen changeNMotMaxRpm; + FieldWeakMaxChangeScreen changeFieldWeakMax; + PhaseAdvMaxChangeScreen changePhaseAdvMax; + + WheelDiameterMmChangeScreen wheelDiameterMmChangeScreen; + WheelDiameterInchChangeScreen wheelDiameterInchChangeScreen; + NumMagnetPolesChangeScreen numMagnetPolesChangeScreen; + + DefaultModeCtrlTypChangeDisplay changeDefaultModeCtrlTyp; + DefaultModeCtrlModChangeDisplay changeDefaultModeCtrlMod; + DefaultModeSmoothingChangeDisplay changeDefaultModeSmoothing; + DefaultModeFrontPercentageChangeDisplay changeDefaultModeFrontPercentage; + DefaultModeBackPercentageChangeDisplay changeDefaultModeBackPercentage; + DefaultModeAddSchwelleChangeDisplay changeDefaultModeAddSchwelle; + DefaultModeGas1WertChangeDisplay changeDefaultModeGas1Wert; + DefaultModeGas2WertChangeDisplay changeDefaultModeGas2Wert; + DefaultModeBrems1WertChangeDisplay changeDefaultModeBrems1Wert; + DefaultModeBrems2WertChangeDisplay changeDefaultModeBrems2Wert; + + TempomatModeCtrlTypChangeScreen changeManualModeCtrlTyp; + TempomatModeCtrlModChangeScreen changeManualModeCtrlMod; + + LarsmModeModeChangeDisplay larsmModeModeChangeDisplay; + LarsmModeIterationsChangeDisplay larsmModeIterationsChangeDisplay; + + SampleCountChangeScreen sampleCountChangeScreen; + GasMinChangeScreen changeGasMin; + GasMaxChangeScreen changeGasMax; + BremsMinChangeScreen changeBremsMin; + BremsMaxChangeScreen changeBremsMax; + + WifiModeChangeScreen wifiModeChangeScreen; + WifiTxPowerChangeScreen wifiTxPowerChangeScreen; + + GasGraphDisplay gasGraphDisplay; + BremsGraphDisplay bremsGraphDisplay; + AvgSpeedGraphDisplay avgSpeedGraphDisplay; + AvgSpeedKmhGraphDisplay avgSpeedKmhGraphDisplay; + SumCurrentGraphDisplay sumCurrentGraphDisplay; + SumAbsoluteCurrentGraphDisplay sumAbsoluteCurrentGraphDisplay; + FrontVoltageGraphDisplay frontVoltageGraphDisplay; + BackVoltageGraphDisplay backVoltageGraphDisplay; + BmsVoltageGraphDisplay bmsVoltageGraphDisplay; + BmsCurrentGraphDisplay bmsCurrentGraphDisplay; + BmsPowerGraphDisplay bmsPowerGraphDisplay; + SumCurrentsComparisonGraphDisplay sumCurrentsComparisonGraphDisplay; + MotorCurrentsGraphDisplay motorCurrentsGraphDisplay; +} displays; + +template T &getRefByType() = delete; +template<> decltype(displays.aboutMenu) &getRefByType() { return displays.aboutMenu; } +template<> decltype(displays.accessPointWifiSettingsMenu) &getRefByType() { return displays.accessPointWifiSettingsMenu; } +template<> decltype(displays.bluetoothSettingsMenu) &getRefByType() { return displays.bluetoothSettingsMenu; } +template<> decltype(displays.bmsMenu) &getRefByType() { return displays.bmsMenu; } +template<> decltype(displays.buzzerMenu) &getRefByType() { return displays.buzzerMenu; } +template<> decltype(displays.frontCommandDebugMenu) &getRefByType() { return displays.frontCommandDebugMenu; } +template<> decltype(displays.backCommandDebugMenu) &getRefByType() { return displays.backCommandDebugMenu; } +template<> decltype(displays.debugMenu) &getRefByType() { return displays.debugMenu; } +template<> decltype(displays.defaultModeSettingsMenu) &getRefByType() { return displays.defaultModeSettingsMenu; } +template<> decltype(displays.demosMenu) &getRefByType() { return displays.demosMenu; } +template<> decltype(displays.dynamicDebugMenu) &getRefByType() { return displays.dynamicDebugMenu; } +template<> decltype(displays.enableMenu) &getRefByType() { return displays.enableMenu; } +template<> decltype(displays.frontFeedbackDebugMenu) &getRefByType() { return displays.frontFeedbackDebugMenu; } +template<> decltype(displays.backFeedbackDebugMenu) &getRefByType() { return displays.backFeedbackDebugMenu; } +template<> decltype(displays.genericWifiSettingsMenu) &getRefByType() { return displays.genericWifiSettingsMenu; } +template<> decltype(displays.graphsMenu) &getRefByType() { return displays.graphsMenu; } +template<> decltype(displays.hardwareSettingsMenu) &getRefByType() { return displays.hardwareSettingsMenu; } +template<> decltype(displays.invertMenu) &getRefByType() { return displays.invertMenu; } +template<> decltype(displays.larsmModeSettingsMenu) &getRefByType() { return displays.larsmModeSettingsMenu; } +template<> decltype(displays.limitsSettingsMenu) &getRefByType() { return displays.limitsSettingsMenu; } +template<> decltype(displays.mainMenu) &getRefByType() { return displays.mainMenu; } +template<> decltype(displays.tempomatModeSettingsMenu) &getRefByType() { return displays.tempomatModeSettingsMenu; } +template<> decltype(displays.modesSettingsMenu) &getRefByType() { return displays.modesSettingsMenu; } +template<> decltype(displays.frontLeftMotorStateDebugMenu) &getRefByType() { return displays.frontLeftMotorStateDebugMenu; } +template<> decltype(displays.frontRightMotorStateDebugMenu) &getRefByType() { return displays.frontRightMotorStateDebugMenu; } +template<> decltype(displays.backLeftMotorStateDebugMenu) &getRefByType() { return displays.backLeftMotorStateDebugMenu; } +template<> decltype(displays.backRightMotorStateDebugMenu) &getRefByType() { return displays.backRightMotorStateDebugMenu; } +template<> decltype(displays.frontLeftMotorFeedbackDebugMenu) &getRefByType() { return displays.frontLeftMotorFeedbackDebugMenu; } +template<> decltype(displays.frontRightMotorFeedbackDebugMenu) &getRefByType() { return displays.frontRightMotorFeedbackDebugMenu; } +template<> decltype(displays.backLeftMotorFeedbackDebugMenu) &getRefByType() { return displays.backLeftMotorFeedbackDebugMenu; } +template<> decltype(displays.backRightMotorFeedbackDebugMenu) &getRefByType() { return displays.backRightMotorFeedbackDebugMenu; } +template<> decltype(displays.potiSettingsMenu) &getRefByType() { return displays.potiSettingsMenu; } +template<> decltype(displays.presetsMenu) &getRefByType() { return displays.presetsMenu; } +template<> decltype(displays.selectModeMenu) &getRefByType() { return displays.selectModeMenu; } +template<> decltype(displays.settingsMenu) &getRefByType() { return displays.settingsMenu; } +template<> decltype(displays.stationWifiSettingsMenu) &getRefByType() { return displays.stationWifiSettingsMenu; } +template<> decltype(displays.wifiScanMenu) &getRefByType() { return displays.wifiScanMenu; } +template<> decltype(displays.wifiSettingsMenu) &getRefByType() { return displays.wifiSettingsMenu; } + +template<> decltype(displays.bmsDisplay) &getRefByType() { return displays.bmsDisplay; } +template<> decltype(displays.calibrateDisplay) &getRefByType() { return displays.calibrateDisplay; } +template<> decltype(displays.dualGraphDisplay) &getRefByType() { return displays.dualGraphDisplay; } +template<> decltype(displays.gameOfLifeDisplay) &getRefByType() { return displays.gameOfLifeDisplay; } +template<> decltype(displays.lockScreen) &getRefByType() { return displays.lockScreen; } +template<> decltype(displays.matrixDisplay) &getRefByType() { return displays.matrixDisplay; } +template<> decltype(displays.metersDisplay) &getRefByType() { return displays.metersDisplay; } +template<> decltype(displays.pingPongDisplay) &getRefByType() { return displays.pingPongDisplay; } +template<> decltype(displays.poweroffDisplay) &getRefByType() { return displays.poweroffDisplay; } +template<> decltype(displays.spiroDisplay) &getRefByType() { return displays.spiroDisplay; } +template<> decltype(displays.starFieldDisplay) &getRefByType() { return displays.starFieldDisplay; } +template<> decltype(displays.statusDisplay) &getRefByType() { return displays.statusDisplay; } +template<> decltype(displays.updateDisplay) &getRefByType() { return displays.updateDisplay; } + +template<> decltype(displays.changeFrontFreq) &getRefByType() { return displays.changeFrontFreq; } +template<> decltype(displays.changeFrontPattern) &getRefByType() { return displays.changeFrontPattern; } +template<> decltype(displays.changeBackFreq) &getRefByType() { return displays.changeBackFreq; } +template<> decltype(displays.changeBackPattern) &getRefByType() { return displays.changeBackPattern; } +template<> decltype(displays.changeReverseBeepFreq0) &getRefByType() { return displays.changeReverseBeepFreq0; } +template<> decltype(displays.changeReverseBeepFreq1) &getRefByType() { return displays.changeReverseBeepFreq1; } +template<> decltype(displays.changeReverseBeepDuration0) &getRefByType() { return displays.changeReverseBeepDuration0; } +template<> decltype(displays.changeReverseBeepDuration1) &getRefByType() { return displays.changeReverseBeepDuration1; } + +template<> decltype(displays.changeIMotMax) &getRefByType() { return displays.changeIMotMax; } +template<> decltype(displays.changeIDcMax) &getRefByType() { return displays.changeIDcMax; } +template<> decltype(displays.changeNMotMaxKmh) &getRefByType() { return displays.changeNMotMaxKmh; } +template<> decltype(displays.changeNMotMaxRpm) &getRefByType() { return displays.changeNMotMaxRpm; } +template<> decltype(displays.changeFieldWeakMax) &getRefByType() { return displays.changeFieldWeakMax; } +template<> decltype(displays.changePhaseAdvMax) &getRefByType() { return displays.changePhaseAdvMax; } + +template<> decltype(displays.wheelDiameterMmChangeScreen) &getRefByType() { return displays.wheelDiameterMmChangeScreen; } +template<> decltype(displays.wheelDiameterInchChangeScreen) &getRefByType() { return displays.wheelDiameterInchChangeScreen; } +template<> decltype(displays.numMagnetPolesChangeScreen) &getRefByType() { return displays.numMagnetPolesChangeScreen; } + +template<> decltype(displays.changeDefaultModeCtrlTyp) &getRefByType() { return displays.changeDefaultModeCtrlTyp; } +template<> decltype(displays.changeDefaultModeCtrlMod) &getRefByType() { return displays.changeDefaultModeCtrlMod; } +template<> decltype(displays.changeDefaultModeSmoothing) &getRefByType() { return displays.changeDefaultModeSmoothing; } +template<> decltype(displays.changeDefaultModeFrontPercentage) &getRefByType() { return displays.changeDefaultModeFrontPercentage; } +template<> decltype(displays.changeDefaultModeBackPercentage) &getRefByType() { return displays.changeDefaultModeBackPercentage; } +template<> decltype(displays.changeDefaultModeAddSchwelle) &getRefByType() { return displays.changeDefaultModeAddSchwelle; } +template<> decltype(displays.changeDefaultModeGas1Wert) &getRefByType() { return displays.changeDefaultModeGas1Wert; } +template<> decltype(displays.changeDefaultModeGas2Wert) &getRefByType() { return displays.changeDefaultModeGas2Wert; } +template<> decltype(displays.changeDefaultModeBrems1Wert) &getRefByType() { return displays.changeDefaultModeBrems1Wert; } +template<> decltype(displays.changeDefaultModeBrems2Wert) &getRefByType() { return displays.changeDefaultModeBrems2Wert; } + +template<> decltype(displays.changeManualModeCtrlTyp) &getRefByType() { return displays.changeManualModeCtrlTyp; } +template<> decltype(displays.changeManualModeCtrlMod) &getRefByType() { return displays.changeManualModeCtrlMod; } + +template<> decltype(displays.larsmModeModeChangeDisplay) &getRefByType() { return displays.larsmModeModeChangeDisplay; } +template<> decltype(displays.larsmModeIterationsChangeDisplay) &getRefByType() { return displays.larsmModeIterationsChangeDisplay; } + +template<> decltype(displays.sampleCountChangeScreen) &getRefByType() { return displays.sampleCountChangeScreen; } +template<> decltype(displays.changeGasMin) &getRefByType() { return displays.changeGasMin; } +template<> decltype(displays.changeGasMax) &getRefByType() { return displays.changeGasMax; } +template<> decltype(displays.changeBremsMin) &getRefByType() { return displays.changeBremsMin; } +template<> decltype(displays.changeBremsMax) &getRefByType() { return displays.changeBremsMax; } + +template<> decltype(displays.wifiModeChangeScreen) &getRefByType() { return displays.wifiModeChangeScreen; } +template<> decltype(displays.wifiTxPowerChangeScreen) &getRefByType() { return displays.wifiTxPowerChangeScreen; } + +template<> decltype(displays.gasGraphDisplay) &getRefByType() { return displays.gasGraphDisplay; } +template<> decltype(displays.bremsGraphDisplay) &getRefByType() { return displays.bremsGraphDisplay; } +template<> decltype(displays.avgSpeedGraphDisplay) &getRefByType() { return displays.avgSpeedGraphDisplay; } +template<> decltype(displays.avgSpeedKmhGraphDisplay) &getRefByType() { return displays.avgSpeedKmhGraphDisplay; } +template<> decltype(displays.sumCurrentGraphDisplay) &getRefByType() { return displays.sumCurrentGraphDisplay; } +template<> decltype(displays.sumAbsoluteCurrentGraphDisplay) &getRefByType() { return displays.sumAbsoluteCurrentGraphDisplay; } +template<> decltype(displays.frontVoltageGraphDisplay) &getRefByType() { return displays.frontVoltageGraphDisplay; } +template<> decltype(displays.backVoltageGraphDisplay) &getRefByType() { return displays.backVoltageGraphDisplay; } +template<> decltype(displays.bmsVoltageGraphDisplay) &getRefByType() { return displays.bmsVoltageGraphDisplay; } +template<> decltype(displays.bmsCurrentGraphDisplay) &getRefByType() { return displays.bmsCurrentGraphDisplay; } +template<> decltype(displays.bmsPowerGraphDisplay) &getRefByType() { return displays.bmsPowerGraphDisplay; } +template<> decltype(displays.sumCurrentsComparisonGraphDisplay) &getRefByType() { return displays.sumCurrentsComparisonGraphDisplay; } +template<> decltype(displays.motorCurrentsGraphDisplay) &getRefByType() { return displays.motorCurrentsGraphDisplay; } + + +void deconstructScreen() +{ + if (currentDisplay) + { + currentDisplay->stop(); + currentDisplay->~Display(); + currentDisplay = nullptr; + } +} + +template +void switchScreenImpl(Args&&... args) +{ + deconstructScreen(); + + T &ref = getRefByType(); + new (&ref) T{std::forward(args)...}; + currentDisplay = &ref; + ref.start(); + ref.initScreen(); + ref.update(); + ref.redraw(); +} + +std::function changeScreenCallback; + +template +void switchScreen(Args&&... args) +{ + if (currentDisplay) + changeScreenCallback = [&args...](){ switchScreenImpl(std::forward(args)...); }; + else + switchScreenImpl(std::forward(args)...); +} + +void initScreen() +{ + tft.init(); + tft.fillScreen(TFT_WHITE); + tft.setTextColor(TFT_BLACK); + tft.pushImage(0, 40, icons::logo.WIDTH, icons::logo.HEIGHT, icons::logo.buffer); + tft.drawString("Bobbycar-OS", 32, 200, 4); + tft.drawString("booting...", 32, 225, 4); +} + +void updateDisplay() +{ + if (rotated) + { + const auto rotatedCopy = rotated; + rotated = 0; + + if (currentDisplay) + currentDisplay->rotate(rotatedCopy); + } + + if (requestFullRedraw) + { + requestFullRedraw = false; + + tft.init(); + + if (currentDisplay) + currentDisplay->initScreen(); + } + + if (buttonLongPressed) + { + buttonLongPressed = false; + Serial.println("todo: implement long press"); + } + + if (buttonPressed) + { + buttonPressed = false; + + if (currentDisplay) + currentDisplay->button(); + } + + if (currentDisplay) + currentDisplay->update(); + + if (changeScreenCallback) + { + changeScreenCallback(); + changeScreenCallback = {}; + } +} + +void redrawDisplay() +{ + if (currentDisplay) + currentDisplay->redraw(); +} +} diff --git a/src/serialhandler.h b/src/serialhandler.h new file mode 100644 index 0000000..2396f43 --- /dev/null +++ b/src/serialhandler.h @@ -0,0 +1,92 @@ +#pragma once + +#include +#include + +#include "globals.h" +#include "utils.h" +#include "screens.h" + +namespace { +wl_status_t last_status; +IPAddress last_ip; + +void handleSerial() +{ + const auto status = WiFi.status(); + if (last_status != status) + { + Serial.print("Status changed to: "); + Serial.println(toString(status)); + last_status = status; + } + + const auto ip = WiFi.localIP(); + if (last_ip != ip) + { + Serial.print("IP changed to: "); + Serial.println(ip.toString()); + last_ip = ip; + } + + while(Serial.available()) + { + const auto c = Serial.read(); + + switch (c) + { + case 'i': + case 'I': + tft.init(); + break; + case 'p': + case 'P': + { + const auto firstPower = front.command.poweroff; + for (Controller &controller : controllers()) + controller.command.poweroff = !firstPower; + break; + } + case 'l': + case 'L': + { + const auto firstLed = front.command.led; + for (Controller &controller : controllers()) + controller.command.led = !firstLed; + break; + } + case 'r': + case 'R': + loadSettings(); + break; + case 's': + case 'S': + saveSettings(); + break; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + for (Controller &controller : controllers()) + controller.command.buzzer.freq = c-'0'; + break; + case 'A': + InputDispatcher::rotate(-1); + break; + case 'B': + InputDispatcher::rotate(1); + break; + case 'C': + InputDispatcher::button(true); + InputDispatcher::button(false); + break; + } + } +} +} diff --git a/src/settings.h b/src/settings.h new file mode 100644 index 0000000..525c5ad --- /dev/null +++ b/src/settings.h @@ -0,0 +1,122 @@ +#pragma once + +#include + +#include "bobbycar-protocol/protocol.h" + +namespace { +enum class LarsmModeMode : uint8_t { Mode1, Mode2, Mode3, Mode4 }; + +struct Settings +{ + bool autoConnectBms; + bool reverseBeep; + uint8_t reverseBeepFreq0; + uint8_t reverseBeepFreq1; + int16_t reverseBeepDuration0; + int16_t reverseBeepDuration1; + + struct Limits { + int16_t iMotMax; // [A] Maximum motor current limit + int16_t iDcMax; // [A] Maximum DC Link current limit (This is the current protection. Above this value, current chopping is applied. To avoid this make sure that I_DC_MAX = I_MOT_MAX + 2A) + int16_t nMotMax; // [rpm] Maximum motor speed limit + int16_t fieldWeakMax; // [A] Maximum Field Weakening D axis current (only for FOC). Higher current results in higher maximum speed. + int16_t phaseAdvMax; // [deg] Maximum Phase Advance angle (only for SIN). Higher angle results in higher maximum speed. + } limits; + + struct Hardware { + bool enableFrontLeft, enableFrontRight, enableBackLeft, enableBackRight; + bool invertFrontLeft, invertFrontRight, invertBackLeft, invertBackRight; + + struct Poti { + int16_t sampleCount; + int16_t gasMin, gasMax, bremsMin, bremsMax; + } poti; + + int16_t wheelDiameter; // in mm + int16_t numMagnetPoles; // virtual RPM per one real RPM + bool swapFrontBack; + } hardware; + + struct DefaultMode { + ControlType ctrlTyp; + ControlMode ctrlMod; + bool enableSmoothing; + int16_t smoothing; + int16_t frontPercentage; + int16_t backPercentage; + int16_t add_schwelle; + int16_t gas1_wert; + int16_t gas2_wert; + int16_t brems1_wert; + int16_t brems2_wert; + } defaultMode; + + struct TempomatMode { + ControlType ctrlTyp; + ControlMode ctrlMod; + } tempomatMode; + + struct LarsmMode { + LarsmModeMode mode; + uint8_t iterations; + } larsmMode; + + + template + void executeForEverySetting(T &&callable); +}; + +template +void Settings::executeForEverySetting(T &&callable) +{ + callable("autoConnectBms", autoConnectBms); + callable("reverseBeep", reverseBeep); + callable("revBeepFreq0", reverseBeepFreq0); + callable("revBeepFreq1", reverseBeepFreq1); + callable("revBeepDur0", reverseBeepDuration0); + callable("revBeepDur1", reverseBeepDuration1); + + callable("iMotMax", limits.iMotMax); + callable("iDcMax", limits.iDcMax); + callable("nMotMax", limits.nMotMax); + callable("fieldWeakMax", limits.fieldWeakMax); + callable("phaseAdvMax", limits.phaseAdvMax); + + callable("enableFrontLeft", hardware.enableFrontLeft); + callable("enableFrontRigh", hardware.enableFrontRight); + callable("enableBackLeft", hardware.enableBackLeft); + callable("enableBackRight", hardware.enableBackRight); + + callable("invertFrontLeft", hardware.invertFrontLeft); + callable("invertFrontRigh", hardware.invertFrontRight); + callable("invertBackLeft", hardware.invertBackLeft); + callable("invertBackRight", hardware.invertBackRight); + + callable("sampleCount", hardware.poti.sampleCount); + callable("gasMin", hardware.poti.gasMin); + callable("gasMax", hardware.poti.gasMax); + callable("bremsMin", hardware.poti.bremsMin); + callable("bremsMax", hardware.poti.bremsMax); + + callable("swapFrontBack", hardware.swapFrontBack); + + callable("default.ctrlTyp", defaultMode.ctrlTyp); + callable("default.ctrlMod", defaultMode.ctrlMod); + callable("default.enableS", defaultMode.enableSmoothing); + callable("default.smoothi", defaultMode.smoothing); + callable("default.frontPe", defaultMode.frontPercentage); + callable("default.backPer", defaultMode.backPercentage); + callable("default.add_sch", defaultMode.add_schwelle); + callable("default.gas1_we", defaultMode.gas1_wert); + callable("default.gas2_we", defaultMode.gas2_wert); + callable("default.brems1_", defaultMode.brems1_wert); + callable("default.brems2_", defaultMode.brems2_wert); + + callable("tempoma.ctrlTyp", tempomatMode.ctrlTyp); + callable("tempomt.ctrlMod", tempomatMode.ctrlMod); + + callable("larsm.mode", larsmMode.mode); + callable("larsm.iters", larsmMode.iterations); +} +} diff --git a/src/settingsaccessors.h b/src/settingsaccessors.h new file mode 100644 index 0000000..18452af --- /dev/null +++ b/src/settingsaccessors.h @@ -0,0 +1,78 @@ +#pragma once + +#include "globals.h" +#include "accessorinterface.h" +#include "utils.h" + +namespace { +//! Special type of RefAccessor that also saves settings after setValue() +template +struct RefAccessorSaveSettings : public virtual RefAccessor +{ + void setValue(T value) override { RefAccessor::setValue(value); saveSettings(); }; +}; + +struct AutoConnectBmsAccessor : public RefAccessorSaveSettings { bool &getRef() const override { return settings.autoConnectBms; } }; +struct ReverseBeepAccessor : public RefAccessorSaveSettings { bool &getRef() const override { return settings.reverseBeep; } }; +struct ReverseBeepFreq0Accessor : public RefAccessorSaveSettings { uint8_t &getRef() const override { return settings.reverseBeepFreq0; } }; +struct ReverseBeepFreq1Accessor : public RefAccessorSaveSettings { uint8_t &getRef() const override { return settings.reverseBeepFreq1; } }; +struct ReverseBeepDuration0Accessor : public RefAccessorSaveSettings { int16_t &getRef() const override { return settings.reverseBeepDuration0; } }; +struct ReverseBeepDuration1Accessor : public RefAccessorSaveSettings { int16_t &getRef() const override { return settings.reverseBeepDuration1; } }; + +struct IMotMaxAccessor : public RefAccessorSaveSettings { int16_t &getRef() const override { return settings.limits.iMotMax; } }; +struct IDcMaxAccessor : public RefAccessorSaveSettings { int16_t &getRef() const override { return settings.limits.iDcMax; } }; +struct NMotMaxKmhAccessor : public virtual AccessorInterface +{ + int16_t getValue() const override { return convertToKmh(settings.limits.nMotMax); } + void setValue(int16_t value) override { settings.limits.nMotMax = convertFromKmh(value); saveSettings(); } +}; +struct NMotMaxRpmAccessor : public RefAccessorSaveSettings { int16_t &getRef() const override { return settings.limits.nMotMax; } }; +struct FieldWeakMaxAccessor : public RefAccessorSaveSettings { int16_t &getRef() const override { return settings.limits.fieldWeakMax; } }; +struct PhaseAdvMaxAccessor : public RefAccessorSaveSettings { int16_t &getRef() const override { return settings.limits.phaseAdvMax; } }; + +struct FrontLeftEnabledAccessor : public RefAccessorSaveSettings { bool &getRef() const override { return settings.hardware.enableFrontLeft; } }; +struct FrontRightEnabledAccessor : public RefAccessorSaveSettings { bool &getRef() const override { return settings.hardware.enableFrontRight; } }; +struct BackLeftEnabledAccessor : public RefAccessorSaveSettings { bool &getRef() const override { return settings.hardware.enableBackLeft; } }; +struct BackRightEnabledAccessor : public RefAccessorSaveSettings { bool &getRef() const override { return settings.hardware.enableBackRight; } }; + +struct FrontLeftInvertedAccessor : public RefAccessorSaveSettings { bool &getRef() const override { return settings.hardware.invertFrontLeft; } }; +struct FrontRightInvertedAccessor : public RefAccessorSaveSettings { bool &getRef() const override { return settings.hardware.invertFrontRight; } }; +struct BackLeftInvertedAccessor : public RefAccessorSaveSettings { bool &getRef() const override { return settings.hardware.invertBackLeft; } }; +struct BackRightInvertedAccessor : public RefAccessorSaveSettings { bool &getRef() const override { return settings.hardware.invertBackRight; } }; + +struct SampleCountAccessor : public RefAccessorSaveSettings { int16_t &getRef() const override { return settings.hardware.poti.sampleCount; } }; +struct GasMinAccessor : public RefAccessorSaveSettings { int16_t &getRef() const override { return settings.hardware.poti.gasMin; } }; +struct GasMaxAccessor : public RefAccessorSaveSettings { int16_t &getRef() const override { return settings.hardware.poti.gasMax; } }; +struct BremsMinAccessor : public RefAccessorSaveSettings { int16_t &getRef() const override { return settings.hardware.poti.bremsMin; } }; +struct BremsMaxAccessor : public RefAccessorSaveSettings { int16_t &getRef() const override { return settings.hardware.poti.bremsMax; } }; + +struct WheelDiameterMmAccessor : public RefAccessorSaveSettings { int16_t &getRef() const override { return settings.hardware.wheelDiameter; } }; +struct WheelDiameterInchAccessor : public virtual AccessorInterface +{ + float getValue() const override { return convertToInch(settings.hardware.wheelDiameter); } + void setValue(float value) override { settings.hardware.wheelDiameter = convertFromInch(value); saveSettings(); } +}; +struct NumMagnetPolesAccessor : public RefAccessorSaveSettings { int16_t &getRef() const override { return settings.hardware.numMagnetPoles; } }; +struct SwapFrontBackAccessor : public RefAccessorSaveSettings { + bool &getRef() const override { return settings.hardware.swapFrontBack; } + void setValue(bool value) override { RefAccessorSaveSettings::setValue(value); updateSwapFrontBack(); }; +}; + +struct DefaultModeCtrlTypAccessor : public RefAccessorSaveSettings { ControlType &getRef() const override { return settings.defaultMode.ctrlTyp; } }; +struct DefaultModeCtrlModAccessor : public RefAccessorSaveSettings { ControlMode &getRef() const override { return settings.defaultMode.ctrlMod; } }; +struct DefaultModeEnableSmoothingAccessor : public RefAccessorSaveSettings { bool &getRef() const override { return settings.defaultMode.enableSmoothing; } }; +struct DefaultModeSmoothingAccessor : public RefAccessorSaveSettings { int16_t &getRef() const override { return settings.defaultMode.smoothing; } }; +struct DefaultModeFrontPercentageAccessor : public RefAccessorSaveSettings { int16_t &getRef() const override { return settings.defaultMode.frontPercentage; } }; +struct DefaultModeBackPercentageAccessor : public RefAccessorSaveSettings { int16_t &getRef() const override { return settings.defaultMode.backPercentage; } }; +struct DefaultModeAddSchwelleAccessor : public RefAccessorSaveSettings { int16_t &getRef() const override { return settings.defaultMode.add_schwelle; } }; +struct DefaultModeGas1WertAccessor : public RefAccessorSaveSettings { int16_t &getRef() const override { return settings.defaultMode.gas1_wert; } }; +struct DefaultModeGas2WertAccessor : public RefAccessorSaveSettings { int16_t &getRef() const override { return settings.defaultMode.gas2_wert; } }; +struct DefaultModeBrems1WertAccessor : public RefAccessorSaveSettings { int16_t &getRef() const override { return settings.defaultMode.brems1_wert; } }; +struct DefaultModeBrems2WertAccessor : public RefAccessorSaveSettings { int16_t &getRef() const override { return settings.defaultMode.brems2_wert; } }; + +struct TempomatModeCtrlTypAccessor : public RefAccessorSaveSettings { ControlType &getRef() const override { return settings.tempomatMode.ctrlTyp; } }; +struct TempomatModeCtrlModAccessor : public RefAccessorSaveSettings { ControlMode &getRef() const override { return settings.tempomatMode.ctrlMod; } }; + +struct LarsmModeModeAccessor : public RefAccessorSaveSettings { LarsmModeMode &getRef() const override { return settings.larsmMode.mode; } }; +struct LarsmModeIterationsAccessor : public RefAccessorSaveSettings { uint8_t &getRef() const override { return settings.larsmMode.iterations; } }; +} diff --git a/src/settingssaver.h b/src/settingssaver.h new file mode 100644 index 0000000..dec0fd0 --- /dev/null +++ b/src/settingssaver.h @@ -0,0 +1,150 @@ +#pragma once + +#include + +#include +#include +#include + +#include "settings.h" + +namespace { +class SettingsSaver +{ +public: + bool init(); + bool load(Settings &settings); + bool save(Settings &settings); + +private: + nvs_handle my_handle; +}; + +bool SettingsSaver::init() +{ + esp_err_t err = nvs_flash_init(); + if (err == ESP_ERR_NVS_NO_FREE_PAGES || err == ESP_ERR_NVS_NEW_VERSION_FOUND) + { + Serial.printf("nvs_flash_init() returned: %s, trying to erase\r\n", esp_err_to_name(err)); + err = nvs_flash_erase(); + if (err != ESP_OK) + { + Serial.printf("nvs_flash_erase() returned: %s, aborting\r\n", esp_err_to_name(err)); + return false; + } + + err = nvs_flash_init(); + } + + if (err != ESP_OK) + { + Serial.printf("nvs_flash_init() returned: %s\r\n", esp_err_to_name(err)); + return false; + } + + err = nvs_open("bobbycar", NVS_READWRITE, &my_handle); + if (err != ESP_OK) + { + Serial.printf("nvs_open() returned: %s\r\n", esp_err_to_name(err)); + return false; + } + + return true; +} + +template struct nvsGetterHelper; +template<> struct nvsGetterHelper { static constexpr auto nvs_get = &nvs_get_i8; }; +template<> struct nvsGetterHelper { static constexpr auto nvs_get = &nvs_get_u8; }; +template<> struct nvsGetterHelper { static constexpr auto nvs_get = &nvs_get_i16; }; +template<> struct nvsGetterHelper { static constexpr auto nvs_get = &nvs_get_u16; }; +template<> struct nvsGetterHelper { static constexpr auto nvs_get = &nvs_get_i32; }; +template<> struct nvsGetterHelper { static constexpr auto nvs_get = &nvs_get_u32; }; +template<> struct nvsGetterHelper { static esp_err_t nvs_get(nvs_handle handle, const char* key, bool* out_value) + { + uint8_t tempValue; + esp_err_t err = nvs_get_u8(handle, key, &tempValue); + if (err == ESP_OK) + *out_value = tempValue; + return err; + }}; +template<> struct nvsGetterHelper { static esp_err_t nvs_get(nvs_handle handle, const char* key, ControlType* out_value) + { + uint8_t tempValue; + esp_err_t err = nvs_get_u8(handle, key, &tempValue); + if (err == ESP_OK) + *out_value = ControlType(tempValue); + return err; + }}; +template<> struct nvsGetterHelper { static esp_err_t nvs_get(nvs_handle handle, const char* key, ControlMode* out_value) + { + uint8_t tempValue; + esp_err_t err = nvs_get_u8(handle, key, &tempValue); + if (err == ESP_OK) + *out_value = ControlMode(tempValue); + return err; + }}; +template<> struct nvsGetterHelper { static esp_err_t nvs_get(nvs_handle handle, const char* key, LarsmModeMode* out_value) + { + uint8_t tempValue; + esp_err_t err = nvs_get_u8(handle, key, &tempValue); + if (err == ESP_OK) + *out_value = LarsmModeMode(tempValue); + return err; + }}; + +bool SettingsSaver::load(Settings &settings) +{ + bool result{true}; + + settings.executeForEverySetting([&](const char *key, auto &value) + { + esp_err_t err = nvsGetterHelper>::nvs_get(my_handle, key, &value); + if (err != ESP_OK) + { + Serial.printf("nvs_get_i32() for %s returned: %s\r\n", key, esp_err_to_name(err)); + result = false; + } + }); + + return result; +} + +template struct nvsSetterHelper; +template<> struct nvsSetterHelper { static constexpr auto nvs_set = &nvs_set_i8; }; +template<> struct nvsSetterHelper { static constexpr auto nvs_set = &nvs_set_u8; }; +template<> struct nvsSetterHelper { static constexpr auto nvs_set = &nvs_set_i16; }; +template<> struct nvsSetterHelper { static constexpr auto nvs_set = &nvs_set_u16; }; +template<> struct nvsSetterHelper { static constexpr auto nvs_set = &nvs_set_i32; }; +template<> struct nvsSetterHelper { static constexpr auto nvs_set = &nvs_set_u32; }; +template<> struct nvsSetterHelper { static constexpr auto nvs_set = &nvs_set_u8; }; +template<> struct nvsSetterHelper { static esp_err_t nvs_set(nvs_handle handle, const char* key, ControlType value) + { + return nvs_set_u8(handle, key, uint8_t(value)); + }}; +template<> struct nvsSetterHelper { static esp_err_t nvs_set(nvs_handle handle, const char* key, ControlMode value) + { + return nvs_set_u8(handle, key, uint8_t(value)); + }}; +template<> struct nvsSetterHelper { static esp_err_t nvs_set(nvs_handle handle, const char* key, LarsmModeMode value) + { + return nvs_set_u8(handle, key, uint8_t(value)); + }}; + +bool SettingsSaver::save(Settings &settings) +{ + bool result{true}; + + settings.executeForEverySetting([&](const char *key, auto value) + { + esp_err_t err = nvsSetterHelper::nvs_set(my_handle, key, value); + if (err != ESP_OK) + { + Serial.printf("nvs_get_i32() for %s returned: %s\r\n", key, esp_err_to_name(err)); + result = false; + } + return err == ESP_OK; + }); + + return result; +} +} diff --git a/src/staticmenudefinition.h b/src/staticmenudefinition.h new file mode 100644 index 0000000..5dc4e90 --- /dev/null +++ b/src/staticmenudefinition.h @@ -0,0 +1,37 @@ +#pragma once + +#include "menudefinitioninterface.h" + +namespace { +template +class StaticMenuDefinition; + +template +class StaticMenuDefinition : public virtual MenuDefinitionInterface +{ +public: + void runForEveryMenuItem(std::function &&callback) override + { + callback(item); + } + +private: + T item; +}; + +template +class StaticMenuDefinition : public virtual StaticMenuDefinition +{ + using Base = StaticMenuDefinition; + +public: + void runForEveryMenuItem(std::function &&callback) override + { + callback(item); + Base::runForEveryMenuItem(std::move(callback)); + } + +private: + T item; +}; +} diff --git a/src/statistics.h b/src/statistics.h new file mode 100644 index 0000000..38a4c51 --- /dev/null +++ b/src/statistics.h @@ -0,0 +1,68 @@ +#pragma once + +#include "ring-buffer.h" + +#include "globals.h" +#include "bmsutils.h" +#include "utils.h" + +namespace { +namespace statistics { +using ContainerType = ring_buffer; +ContainerType gas, brems, avgSpeed, avgSpeedKmh, sumCurrent, sumAbsoluteCurrent, frontVoltage, backVoltage, frontLeftCurrent, frontRightCurrent, backLeftCurrent, backRightCurrent, bmsVoltage, bmsCurrent, bmsPower; +} + +void pushStats() +{ + statistics::gas.push_back(gas); + statistics::brems.push_back(brems); + statistics::avgSpeed.push_back(avgSpeed); + statistics::avgSpeedKmh.push_back(avgSpeedKmh); + statistics::sumCurrent.push_back(sumCurrent); + statistics::sumAbsoluteCurrent.push_back(sumAbsoluteCurrent); + if (front.feedbackValid) + { + statistics::frontVoltage.push_back(fixBatVoltage(front.feedback.batVoltage)); + statistics::frontLeftCurrent.push_back(fixCurrent(front.feedback.left.current)); + statistics::frontRightCurrent.push_back(fixCurrent(front.feedback.right.current)); + } + if (back.feedbackValid) + { + statistics::backVoltage.push_back(fixBatVoltage(back.feedback.batVoltage)); + statistics::backLeftCurrent.push_back(fixCurrent(back.feedback.left.current)); + statistics::backRightCurrent.push_back(fixCurrent(back.feedback.right.current)); + } + statistics::bmsVoltage.push_back(bms::voltage); + statistics::bmsCurrent.push_back(bms::current); + statistics::bmsPower.push_back(bms::power); +} + +class BufferAccessorInterface +{ +public: + virtual const statistics::ContainerType &getBuffer() const = 0; +}; + +template +class BufferAccessorImpl : public virtual BufferAccessorInterface +{ +public: + const statistics::ContainerType &getBuffer() const override { return T; } +}; + +using GasStatistics = BufferAccessorImpl; +using BremsStatistics = BufferAccessorImpl; +using AvgSpeedStatistics = BufferAccessorImpl; +using AvgSpeedKmhStatistics = BufferAccessorImpl; +using SumCurrentStatistics = BufferAccessorImpl; +using SumAbsoluteCurrentStatistics = BufferAccessorImpl; +using FrontVoltageStatistics = BufferAccessorImpl; +using BackVoltageStatistics = BufferAccessorImpl; +using BmsVoltageStatistics = BufferAccessorImpl; +using BmsCurrentStatistics = BufferAccessorImpl; +using BmsPowerStatistics = BufferAccessorImpl; +using FrontLeftCurrentStatistics = BufferAccessorImpl; +using FrontRightCurrentStatistics = BufferAccessorImpl; +using BackLeftCurrentStatistics = BufferAccessorImpl; +using BackRightCurrentStatistics = BufferAccessorImpl; +} diff --git a/src/textinterface.h b/src/textinterface.h new file mode 100644 index 0000000..5b9d235 --- /dev/null +++ b/src/textinterface.h @@ -0,0 +1,67 @@ +#pragma once + +#include + +namespace { +class TextInterface { +public: + virtual String text() const = 0; +}; + +template +class StaticText : public virtual TextInterface +{ +public: + static constexpr const char *STATIC_TEXT = Ttext; + + String text() const override { return Ttext; } +}; + +class ChangeableText : public virtual TextInterface +{ +public: + String text() const override { return m_title; } + void setTitle(const String &title) { m_title = title; } + +private: + String m_title; +}; + +template +class StatusTextHelper : public virtual TextInterface +{ +public: + String text() const override { return String{Ttext} + (Tptr->*Tmethod)(); } +}; + +template +class CachedText : public virtual T +{ +public: + String text() const override + { + if (!m_loaded) + { + m_text = T::text(); + m_loaded = true; + } + + return m_text; + } + +private: + mutable bool m_loaded{}; + mutable String m_text; +}; + +template +class StaticallyCachedText : public virtual T +{ +public: + String text() const override + { + static const auto text = T::text(); + return text; + } +}; +} diff --git a/src/texts.h b/src/texts.h new file mode 100644 index 0000000..84f16d2 --- /dev/null +++ b/src/texts.h @@ -0,0 +1,296 @@ +#pragma once + +namespace { +//AboutMenu +constexpr char TEXT_ABOUT[] = "About"; +constexpr char TEXT_BACK[] = "Back"; + +//AccessPointWifiSettingsMenu +constexpr char TEXT_ACCESSPOINTWIFISETTINGS[] = "Access Point WiFi settings"; +constexpr char TEXT_WIFISOFTAPENABLEIPV6[] = "softAPenableIpV6()"; +//constexpr char TEXT_BACK[] = "Back"; + +//BluetoothSettingsMenu +constexpr char TEXT_BLUETOOTHSETTINGS[] = "Bluetooth settings"; +constexpr char TEXT_BLUETOOTHBEGIN[] = "begin()"; +constexpr char TEXT_BLUETOOTHBEGINMASTER[] = "begin() Master"; +constexpr char TEXT_BLUETOOTHFLUSH[] = "flush()"; +constexpr char TEXT_BLUETOOTHEND[] = "end()"; +constexpr char TEXT_BLUETOOTHDISCONNECT[] = "disconnect()"; +//constexpr char TEXT_BACK[] = "Back"; + +//BmsMenu +constexpr char TEXT_BMS[] = "BMS"; +constexpr char TEXT_CONNECTBMS[] = "Connect BMS"; +constexpr char TEXT_DISCONNECTBMS[] = "Disonnect BMS"; +constexpr char TEXT_TURNONCHARGE[] = "Turn on charge"; +constexpr char TEXT_TURNOFFCHARGE[] = "Turn off charge"; +constexpr char TEXT_TURNONDISCHARGE[] = "Turn on discharge"; +constexpr char TEXT_TURNOFFDISCHARGE[] = "Turn off discharge"; +//constexpr char TEXT_BACK[] = "Back"; + +//DebugMenu +constexpr char TEXT_LOADSETTINGS[] = "Load settings"; +constexpr char TEXT_SAVESETTINGS[] = "Save settings"; +constexpr char TEXT_FRONTCOMMAND[] = "Front command"; +constexpr char TEXT_BACKCOMMAND[] = "Back command"; +constexpr char TEXT_FRONTLEFTCOMMAND[] = "Front left command"; +constexpr char TEXT_FRONTRIGHTCOMMAND[] = "Front right command"; +constexpr char TEXT_BACKLEFTCOMMAND[] = "Back left command"; +constexpr char TEXT_BACKRIGHTCOMMAND[] = "Back right command"; +constexpr char TEXT_FRONTFEEDBACK[] = "Front feedback"; +constexpr char TEXT_BACKFEEDBACK[] = "Back feedback"; +constexpr char TEXT_FRONTLEFTFEEDBACK[] = "Front left feedback"; +constexpr char TEXT_FRONTRIGHTFEEDBACK[] = "Front right feedback"; +constexpr char TEXT_BACKLEFTFEEDBACK[] = "Back left feedback"; +constexpr char TEXT_BACKRIGHTFEEDBACK[] = "Back right feedback"; +//constexpr char TEXT_BACK[] = "Back"; + +//MainMenu +constexpr char TEXT_MAINMENU[] = "Main menu"; +constexpr char TEXT_STATUS[] = "Status"; +constexpr char TEXT_SELECTMODE[] = "Select mode"; +constexpr char TEXT_PRESETS[] = "Presets"; +constexpr char TEXT_GRAPHS[] = "Graphs"; +//constexpr char TEXT_BMS[] = "BMS"; +constexpr char TEXT_SETTINGS[] = "Settings"; +constexpr char TEXT_LOCKVEHICLE[] = "Lock vehicle"; +constexpr char TEXT_DEMOS[] = "Demos"; +constexpr char TEXT_POWEROFF[] = "Poweroff"; +constexpr char TEXT_REBOOT[] = "Reboot"; +constexpr char TEXT_DEBUG[] = "Debug"; + +//SettingsMenu +//constexpr char TEXT_SETTINGS[] = "Settings"; +constexpr char TEXT_LIMITSSETTINGS[] = "Limits settings"; +constexpr char TEXT_WIFISETTINGS[] = "WiFi settings"; +//constexpr char TEXT_BLUETOOTHSETTINGS[] = "Bluetooth settings"; +constexpr char TEXT_MODESSETTINGS[] = "Modes settings"; +constexpr char TEXT_HARDWARESETTINGS[] = "Hardware settings"; +constexpr char TEXT_AUTOCONNECTBMS[] = "Auto connect BMS"; +constexpr char TEXT_BUZZER[] = "Buzzer"; +constexpr char TEXT_FRONTLED[] = "Front LED"; +constexpr char TEXT_BACKLED[] = "Back LED"; +//constexpr char TEXT_ABOUT[] = "About"; +//constexpr char TEXT_BACK[] = "Back"; + +//HardwareSettings +//constexpr char TEXT_HARDWARESETTINGS[] = "Hardware settings"; +constexpr char TEXT_WHEELDIAMETERMM[] = "Wheel diameter (mm)"; +constexpr char TEXT_WHEELDIAMETERINCH[] = "Wheel diameter (inch)"; +constexpr char TEXT_NUMMAGNETPOLES[] = "Num magnet poles"; +constexpr char TEXT_SETENABLED[] = "Set enabled"; +constexpr char TEXT_SETINVERTED[] = "Set inverted"; +constexpr char TEXT_POTISETTINGS[] = "Poti settings"; +constexpr char TEXT_SWAPFRONTBACK[] = "Swap front/back"; +//constexpr char TEXT_BACK[] = "Back"; + +//StationWifiSettingsMenu +constexpr char TEXT_STATIONWIFISETTINGS[] = "Station WiFi settings"; +constexpr char TEXT_WIFIRECONNECT[] = "reconnect()"; +constexpr char TEXT_WIFIDISCONNECT[] = "disconnect()"; +constexpr char TEXT_WIFICHANGEAUTOCONNECT[] = "Change auto connect"; +constexpr char TEXT_WIFICHANGEAUTORECONNECT[] = "Change auto reconnect"; +constexpr char TEXT_WIFIENABLEIPV6[] = "enableIpV6()"; +//constexpr char TEXT_BACK[] = "Back"; + +//DemosMenu +//constexpr char TEXT_DEMOS[] = "Demos"; +constexpr char TEXT_STARFIELD[] = "Starfield"; +constexpr char TEXT_PINGPONG[] = "PingPong"; +constexpr char TEXT_SPIRO[] = "Spiro"; +constexpr char TEXT_GAMEOFLIFE[] = "GameOfLife"; +constexpr char TEXT_METERS[] = "Meters"; +constexpr char TEXT_MATRIX[] = "Matrix"; +//constexpr char TEXT_BACK[] = "Back"; + +//BuzzerMenu +//constexpr char TEXT_BUZZER[] = "Buzzer"; +constexpr char TEXT_FRONTFREQ[] = "Front freq"; +constexpr char TEXT_FRONTPATTERN[] = "Front pattern"; +constexpr char TEXT_BACKFREQ[] = "Back freq"; +constexpr char TEXT_BACKPATTERN[] = "Back pattern"; +constexpr char TEXT_REVERSEBEEP[] = "Reverse beep"; +constexpr char TEXT_REVERSEBEEPFREQ0[] = "Reverse beep freq0"; +constexpr char TEXT_REVERSEBEEPFREQ1[] = "Reverse beep freq1"; +constexpr char TEXT_REVERSEBEEPDURATION0[] = "Reverse beep duration0"; +constexpr char TEXT_REVERSEBEEPDURATION1[] = "Reverse beep duration1"; +//constexpr char TEXT_BACK[] = "Back"; + +//LimitsSettingsMenu +//constexpr char TEXT_LIMITSSETTINGS[] = "Common settings"; +constexpr char TEXT_SETIMOTMAX[] = "Set iMotMax"; +constexpr char TEXT_SETIDCMAX[] = "Set iDcMax"; +constexpr char TEXT_SETNMOTMAXKMH[] = "Set nMotMax (kmh)"; +constexpr char TEXT_SETNMOTMAX[] = "Set nMotMax"; +constexpr char TEXT_SETFIELDWEAKMAX[] = "Set fieldWeakMax"; +constexpr char TEXT_SETPHASEADVMAX[] = "Set phaseAdvMax"; +//constexpr char TEXT_BACK[] = "Back"; + +//DebugMenu +//constexpr char TEXT_DEBUG[] = "Debug"; +constexpr char TEXT_DYNAMICMENU[] = "Dynamic menu"; +//constexpr char TEXT_BACK[] = "Back"; + +//DefaultModeSettingsMenu +//constexpr char TEXT_DEFAULTMODESETTINGS[] = "Default mode settings"; +constexpr char TEXT_SETCONTROLTYPE[] = "Set control type"; +constexpr char TEXT_SETCONTROLMODE[] = "Set control mode"; +constexpr char TEXT_ENABLESMOOTHING[] = "Enable smoothing"; +constexpr char TEXT_SETSMOOTHING[] = "Set smoothing"; +constexpr char TEXT_SETFRONTPERCENTAGE[] = "Set front percentage"; +constexpr char TEXT_SETBACKPERCENTAGE[] = "Set back percentage"; +constexpr char TEXT_SETADDSCHWELLE[] = "Set add Schwelle"; +constexpr char TEXT_SETGAS1WERT[] = "Set Gas 1 Wert"; +constexpr char TEXT_SETGAS2WERT[] = "Set Gas 2 Wert"; +constexpr char TEXT_SETBREMS1WERT[] = "Set Brems 1 Wert"; +constexpr char TEXT_SETBREMS2WERT[] = "Set Brems 2 Wert"; +//constexpr char TEXT_BACK[] = "Back"; + +//DynamicDebugMenu +//constexpr char TEXT_DYNAMICMENU[] = "Dynamic menu"; +//constexpr char TEXT_BACK[] = "Back"; + +//EnableMenu +//constexpr char TEXT_SETENABLED[] = "Set enabled"; +constexpr char TEXT_ENABLEFRONTLEFT[] = "Enable front left"; +constexpr char TEXT_ENABLEFRONTRIGHT[] = "Enable front right"; +constexpr char TEXT_ENABLEBACKLEFT[] = "Enable back left"; +constexpr char TEXT_ENABLEBACKRIGHT[] = "Enable back right"; +//constexpr char TEXT_BACK[] = "Back"; + +//GenericWifiSettingsMenu +constexpr char TEXT_GENERICWIFISETTINGS[] = "Generic WiFi settings"; +constexpr char TEXT_WIFICHANGEMODE[] = "Change mode"; +constexpr char TEXT_WIFICHANGESLEEP[] = "Change sleep"; +constexpr char TEXT_WIFICHANGETXPOWER[] = "Change tx power"; +constexpr char TEXT_WIFISCAN[] = "WiFi scan"; +//constexpr char TEXT_BACK[] = "Back"; + +//GraphsMenu +//constexpr char TEXT_GRAPHS[] = "Graphs"; +constexpr char TEXT_GAS[] = "Gas"; +constexpr char TEXT_BREMS[] = "Brems"; +constexpr char TEXT_AVGSPEED[] = "Avg. speed"; +constexpr char TEXT_AVGSPEEDKMH[] = "Avg. speed KMH"; +constexpr char TEXT_SUMCURRENT[] = "Sum current"; +constexpr char TEXT_SUMABSOLUTECURRENT[] = "Sum absolute current"; +constexpr char TEXT_FRONTVOLTAGE[] = "Front voltage"; +constexpr char TEXT_BACKVOLTAGE[] = "Back voltage"; +constexpr char TEXT_BMSVOLTAGE[] = "BMS voltage"; +constexpr char TEXT_BMSCURRENT[] = "BMS current"; +constexpr char TEXT_BMSPOWER[] = "BMS power"; +constexpr char TEXT_SUMCURRENTSCOMPARISON[] = "Sum currents comparison"; +constexpr char TEXT_MOTORCURRENTS[] = "Motor currents"; +constexpr char TEXT_DUALGRAPHS[] = "Dual graphs"; +//constexpr char TEXT_BACK[] = "Back"; + +//InvertMenu +//constexpr char TEXT_SETINVERTED[] = "Set inverted"; +constexpr char TEXT_INVERTFRONTLEFT[] = "Invert front left"; +constexpr char TEXT_INVERTFRONTRIGHT[] = "Invert front right"; +constexpr char TEXT_INVERTBACKLEFT[] = "Invert back left"; +constexpr char TEXT_INVERTBACKRIGHT[] = "Invert back right"; +//constexpr char TEXT_BACK[] = "Back"; + +//LarsmModeSettingsMenu +constexpr char TEXT_LARSMMODESETTINGS[] = "Larsm mode settings"; +constexpr char TEXT_LARSMMODECHANGEMODE[] = "Change mode"; +constexpr char TEXT_LARSMMODECHANGEITERATIONS[] = "Change iterations"; +//constexpr char TEXT_BACK[] = "Back"; + +//ModesSettingsMenu +//constexpr char TEXT_MODESSETTINGS[] = "Modes settings"; +constexpr char TEXT_DEFAULTMODESETTIGNS[] = "Default mode settings"; +constexpr char TEXT_TEMPOMATMODESETTINGS[] = "Tempomat mode settings"; +//constexpr char TEXT_LARSMMODESETTINGS[] = "Larsm mode settings"; +//constexpr char TEXT_BACK[] = "Back"; + +//TempomatModeSettingsMenu +//constexpr char TEXT_TEMPOMATMODESETTINGS[] = "Tempomat mode settings"; +//constexpr char TEXT_SETCONTROLTYPE[] = "Set control type"; +//constexpr char TEXT_SETCONTROLMODE[] = "Set control mode"; +//constexpr char TEXT_BACK[] = "Back"; + +//WiFiSettingsMenu +//constexpr char TEXT_WIFISETTINGS[] = "WiFi settings"; +//constexpr char TEXT_GENERICWIFISETTINGS[] = "Generic WiFi settings"; +//constexpr char TEXT_BACK[] = "Back"; + +//PotiSettingsMenu +//constexpr char TEXT_POTISETTINGS[] = "Poti settings"; +constexpr char TEXT_SETSAMPLECOUNT[] = "Set sampleCount"; +constexpr char TEXT_SETGASMIN[] = "Set gasMin"; +constexpr char TEXT_SETGASMAX[] = "Set gasMax"; +constexpr char TEXT_SETBREMSMIN[] = "Set bremsMin"; +constexpr char TEXT_SETBREMSMAX[] = "Set bremsMax"; +constexpr char TEXT_CALIBRATE[] = "Calibrate"; +//constexpr char TEXT_BACK[] = "Back"; + +//PresetsMenu +//constexpr char TEXT_PRESETS[] = "Presets"; +constexpr char TEXT_DEFAULTEVERYTHING[] = "Default everything"; +constexpr char TEXT_DEFAULTLIMITS[] = "Default limits"; +constexpr char TEXT_KIDSLIMITS[] = "Kids limits"; +constexpr char TEXT_DEFAULTPOTI[] = "Default poti"; +constexpr char TEXT_DEFAULTHARDWARE[] = "Default hardware"; +constexpr char TEXT_STREET[] = "Street"; +constexpr char TEXT_SIDEWALK[] = "Sidewalk"; +constexpr char TEXT_POLICE[] = "Police"; +constexpr char TEXT_RACE[] = "Race"; + +//SelectModeMenu +//constexpr char TEXT_SELECTMODE[] = "Select mode"; +constexpr char TEXT_DEFAULT[] = "Default"; +constexpr char TEXT_TEMPOMAT[] = "Tempomat"; +constexpr char TEXT_LARSM[] = "Larsm"; +constexpr char TEXT_BLUETOOTH[] = "Bluetooth"; +//constexpr char TEXT_BACK[] = "Back"; + +//ChangeValueDisplay +constexpr char TEXT_TRUE[] = "true"; +constexpr char TEXT_FALSE[] = "false"; +//constexpr char TEXT_BACK[] = "Back"; + +//ChangeValueDisplay +constexpr char TEXT_OPENMODE[] = "Open mode"; +constexpr char TEXT_VOLTAGE[] = "Voltage"; +constexpr char TEXT_SPEED[] = "Speed"; +constexpr char TEXT_TORQUE[] = "Torque"; +//constexpr char TEXT_BACK[] = "Back"; + +//ChangeValueDisplay +constexpr char TEXT_COMMUTATION[] = "Commutation"; +constexpr char TEXT_SINUSOIDAL[] = "Sinusoidal"; +constexpr char TEXT_FIELDORIENTEDCONTROL[] = "Field oriented control"; +//constexpr char TEXT_BACK[] = "Back"; + +//ChangeValueDisplay +constexpr char TEXT_LARSMMODE1[] = "Mode1"; +constexpr char TEXT_LARSMMODE2[] = "Mode2"; +constexpr char TEXT_LARSMMODE3[] = "Mode3"; +constexpr char TEXT_LARSMMODE4[] = "Mode4"; +//constexpr char TEXT_BACK[] = "Back"; + +//ChangeValueDisplay +constexpr char TEXT_WIFI_MODE_NULL[] = "WIFI_MODE_NULL"; +constexpr char TEXT_WIFI_MODE_STA[] = "WIFI_MODE_STA"; +constexpr char TEXT_WIFI_MODE_AP[] = "WIFI_MODE_AP"; +constexpr char TEXT_WIFI_MODE_APSTA[] = "WIFI_MODE_APSTA"; +//constexpr char TEXT_BACK[] = "Back"; + +//ChangeValueDisplay +constexpr char TEXT_WIFI_POWER_19_5dBm[] = "19.5dBm"; +constexpr char TEXT_WIFI_POWER_19dBm[] = "19dBm"; +constexpr char TEXT_WIFI_POWER_18_5dBm[] = "18.5dBm"; +constexpr char TEXT_WIFI_POWER_17dBm[] = "17dBm"; +constexpr char TEXT_WIFI_POWER_15dBm[] = "15dBm"; +constexpr char TEXT_WIFI_POWER_13dBm[] = "13dBm"; +constexpr char TEXT_WIFI_POWER_11dBm[] = "11dBm"; +constexpr char TEXT_WIFI_POWER_8_5dBm[] = "8.5dBm"; +constexpr char TEXT_WIFI_POWER_7dBm[] = "7dBm"; +constexpr char TEXT_WIFI_POWER_5dBm[] = "5dBm"; +constexpr char TEXT_WIFI_POWER_2dBm[] = "2dBm"; +constexpr char TEXT_WIFI_POWER_MINUS_1dBm[] = "-1dBm"; +//constexpr char TEXT_BACK[] = "Back"; +} diff --git a/src/utils.h b/src/utils.h new file mode 100644 index 0000000..2deb5aa --- /dev/null +++ b/src/utils.h @@ -0,0 +1,335 @@ +#pragma once + +#include + +#include +#include +#include + +#include "display.h" +#include "globals.h" + +namespace { +bool currentlyReverseBeeping; +bool reverseBeepToggle; +unsigned int lastReverseBeepToggle; + +template +class makeComponent : public T... +{}; + +template +T scaleBetween(T x, T in_min, T in_max, T out_min, T out_max) { + if (x < std::min(in_min, in_max)) + x = std::min(in_min, in_max); + else if (x > std::max(in_min, in_max)) + x = std::max(in_min, in_max); + + return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; +}; + +float convertToKmh(float val) +{ + return val /* / settings.hardware.numMagnetPoles */ / 60.f * settings.hardware.wheelDiameter / 1000.f * 3.14159265359f * 3.6f; +} + +float convertFromKmh(float val) +{ + return val /* * settings.hardware.numMagnetPoles */ * 60.f / settings.hardware.wheelDiameter * 1000.f / 3.14159265359f / 3.6f; +} + +float convertToInch(float val) +{ + return val / 25.4f; +} + +float convertFromInch(float val) +{ + return val * 25.4f; +} + +float fixCurrent(int16_t value) +{ + return std::abs(value/50.); +} + +float fixBatVoltage(int16_t value) +{ + return value/100.; +} + +float fixBoardTemp(int16_t value) +{ + return value/10.; +} + +String hallString(const MotorFeedback &motor) +{ + return String{} + (motor.hallA ? '1' : '0') + (motor.hallB ? '1' : '0') + (motor.hallC ? '1' : '0'); +} + +template +String toString(T value) +{ + return String{} + value; +} + +template<> +String toString(bool value) +{ + return value ? "true" : "false"; +} + +template<> +String toString(ControlType value) +{ + switch (value) + { + case ControlType::Commutation: return "Commutation"; + case ControlType::Sinusoidal: return "Sinusoidal"; + case ControlType::FieldOrientedControl: return "FieldOrientedControl"; + } + return String("Unknown: ") + int(value); +} + +template<> +String toString(ControlMode value) +{ + switch (value) + { + case ControlMode::OpenMode: return "OpenMode"; + case ControlMode::Voltage: return "Voltage"; + case ControlMode::Speed: return "Speed"; + case ControlMode::Torque: return "Torque"; + } + return String("Unknown: ") + int(value); +} + +template<> +String toString(wl_status_t value) +{ + switch (value) + { + case WL_NO_SHIELD: return "WL_NO_SHIELD"; + case WL_IDLE_STATUS: return "WL_IDLE_STATUS"; + case WL_NO_SSID_AVAIL: return "WL_NO_SSID_AVAIL"; + case WL_SCAN_COMPLETED: return "WL_SCAN_COMPLETED"; + case WL_CONNECTED: return "WL_CONNECTED"; + case WL_CONNECT_FAILED: return "WL_CONNECT_FAILED"; + case WL_CONNECTION_LOST: return "WL_CONNECTION_LOST"; + case WL_DISCONNECTED: return "WL_DISCONNECTED"; + } + + return String("Unknown: ") + int(value); +} + +template<> +String toString(ota_error_t value) +{ + switch (value) + { + case OTA_AUTH_ERROR: return "OTA_AUTH_ERROR"; + case OTA_BEGIN_ERROR: return "OTA_BEGIN_ERROR"; + case OTA_CONNECT_ERROR: return "OTA_CONNECT_ERROR"; + case OTA_RECEIVE_ERROR: return "OTA_RECEIVE_ERROR"; + case OTA_END_ERROR: return "OTA_END_ERROR"; + } + + return String("Unknown: ") + int(value); +} + +std::array, 2> controllers() +{ + return {front, back}; +} + +std::array, 2> motorsInController(Controller &controller) +{ + return {std::ref(controller.command.left), std::ref(controller.command.right)}; +} + +std::array, 2> motorsInController(const Controller &controller) +{ + return {std::ref(controller.command.left), std::ref(controller.command.right)}; +} + +std::array, 2> motorFeedbacksInController(Controller &controller) +{ + return {std::ref(controller.feedback.left), std::ref(controller.feedback.right)}; +} + +std::array, 2> motorFeedbacksInController(const Controller &controller) +{ + return {std::ref(controller.feedback.left), std::ref(controller.feedback.right)}; +} + +std::array, 4> motors() +{ + return { + std::ref(front.command.left), std::ref(front.command.right), + std::ref(back.command.left), std::ref(back.command.right) + }; +} + +void fixCommonParams() +{ + for (Controller &controller : controllers()) + for (MotorState &motor : motorsInController(controller)) + { + motor.iMotMax = settings.limits.iMotMax; + motor.iDcMax = settings.limits.iDcMax; + motor.nMotMax = settings.limits.nMotMax; + motor.fieldWeakMax = settings.limits.fieldWeakMax; + motor.phaseAdvMax = settings.limits.phaseAdvMax; + } + + if (settings.reverseBeep) + { + const auto x = motors(); + const auto shouldBeep = std::all_of(std::begin(x), std::end(x), [](const MotorState &motor){ return motor.pwm < 0; }); + + if (shouldBeep != currentlyReverseBeeping) + { + if (shouldBeep) + { + reverseBeepToggle = true; + lastReverseBeepToggle = millis(); + for (const auto &ref : controllers()) + ref.get().command.buzzer = {.freq=settings.reverseBeepFreq0, .pattern=0}; + } + else + for (const auto &ref : controllers()) + ref.get().command.buzzer = {}; + + currentlyReverseBeeping = shouldBeep; + } + else if (shouldBeep && millis() - lastReverseBeepToggle >= (reverseBeepToggle?settings.reverseBeepDuration0:settings.reverseBeepDuration1)) + { + reverseBeepToggle = !reverseBeepToggle; + + for (const auto &ref : controllers()) + ref.get().command.buzzer = {.freq=uint8_t(reverseBeepToggle?settings.reverseBeepFreq0:settings.reverseBeepFreq1), .pattern=0}; + + lastReverseBeepToggle = millis(); + } + } + else if (currentlyReverseBeeping) + { + for (const auto &ref : controllers()) + ref.get().command.buzzer = {}; + currentlyReverseBeeping = false; + } + + front.command.left.enable = settings.hardware.enableFrontLeft; + front.command.right.enable = settings.hardware.enableFrontRight; + back.command.left.enable = settings.hardware.enableBackLeft; + back.command.right.enable = settings.hardware.enableBackRight; + + if (settings.hardware.invertFrontLeft) + front.command.left.pwm = -front.command.left.pwm; + if (settings.hardware.invertFrontRight) + front.command.right.pwm = -front.command.right.pwm; + if (settings.hardware.invertBackLeft) + back.command.left.pwm = -back.command.left.pwm; + if (settings.hardware.invertBackRight) + back.command.right.pwm = -back.command.right.pwm; +} + +void sendCommands() +{ + for (Controller &controller : controllers()) + { + controller.command.start = Command::VALID_HEADER; + controller.command.checksum = calculateChecksum(controller.command); + controller.serial.get().write((uint8_t *) &controller.command, sizeof(controller.command)); + } +} + +template +void switchScreen(Args&&... args); + +void setupScrollArea(uint16_t TFA, uint16_t BFA) { + tft.writecommand(ILI9341_VSCRDEF); // Vertical scroll definition + tft.writedata(TFA >> 8); + tft.writedata(TFA); + tft.writedata((320 - TFA - BFA) >> 8); + tft.writedata(320 - TFA - BFA); + tft.writedata(BFA >> 8); + tft.writedata(BFA); +} + +void scrollAddress(uint16_t VSP) { + tft.writecommand(ILI9341_VSCRSADD); // Vertical scrolling start address + tft.writedata(VSP >> 8); + tft.writedata(VSP); +} + +void updateSwapFrontBack() +{ + front.serial = settings.hardware.swapFrontBack ? Serial2 : Serial1; + back.serial = settings.hardware.swapFrontBack ? Serial1 : Serial2; +} + +void loadSettings() +{ + settingsSaver.load(settings); +} + +void saveSettings() +{ + settingsSaver.save(settings); +} + +void updateAccumulators() +{ + avgSpeed = 0.f; + sumCurrent = 0.f; + sumAbsoluteCurrent = 0.f; + uint8_t count{0}; + + for (const Controller &controller : controllers()) + { + if (!controller.feedbackValid) + continue; + + avgSpeed += + controller.feedback.left.speed * (controller.invertLeft ? -1 : 1) + + controller.feedback.right.speed * (controller.invertRight ? -1 : 1); + + sumCurrent += + controller.feedback.left.current + + controller.feedback.right.current; + + sumAbsoluteCurrent += + std::abs(controller.feedback.left.current) + + std::abs(controller.feedback.right.current); + + count +=2; + } + + if (count) + avgSpeed /= count; + + sumCurrent = fixCurrent(sumCurrent); + sumAbsoluteCurrent = fixCurrent(sumAbsoluteCurrent); + + avgSpeedKmh = convertToKmh(avgSpeed); +} + +void readPotis() +{ + const auto sampleMultipleTimes = [](int pin){ + analogRead(pin); + double sum{}; + for (int i = 0; i < settings.hardware.poti.sampleCount; i++) + sum += analogRead(pin); + return sum/settings.hardware.poti.sampleCount; + }; + + raw_gas = sampleMultipleTimes(PINS_GAS); + gas = scaleBetween(raw_gas, settings.hardware.poti.gasMin, settings.hardware.poti.gasMax, 0., 1000.); + + raw_brems = sampleMultipleTimes(PINS_BREMS); + brems = scaleBetween(raw_brems, settings.hardware.poti.bremsMin, settings.hardware.poti.bremsMax, 0., 1000.); +} +} diff --git a/src/widgets/graph.h b/src/widgets/graph.h new file mode 100644 index 0000000..6c58a91 --- /dev/null +++ b/src/widgets/graph.h @@ -0,0 +1,144 @@ +#pragma once + +#include + +#include "globals.h" +#include "ring-buffer.h" +#include "label.h" +//#include "utils.h" + +namespace { +template +class Graph +{ + static constexpr int labelOffset = -5; + static constexpr int leftMargin = 40; + +public: + static constexpr int WIDTH = LENGTH+40; + + Graph(int x, int y, int height); + + void start(const std::array>, COUNT> &buffers); + void redraw(const std::array>, COUNT> &buffers); + +private: + void render(const std::array>, COUNT> &buffers, bool delta); + + const int m_x, m_y, m_height; + + std::array m_labels; + + std::array, LENGTH> m_lastPixels; + + float m_min; + float m_max; +}; + +template +Graph::Graph(int x, int y, int height) : + m_x{x}, m_y{y}, m_height{height}, + m_labels{ + Label{m_x, int(m_y+(m_height/4.f*0)+labelOffset)}, + Label{m_x, int(m_y+(m_height/4.f*1)+labelOffset)}, + Label{m_x, int(m_y+(m_height/4.f*2)+labelOffset)}, + Label{m_x, int(m_y+(m_height/4.f*3)+labelOffset)}, + Label{m_x, int(m_y+(m_height/4.f*4)+labelOffset)}, + } +{ +} + +template +void Graph::start(const std::array>, COUNT> &buffers) +{ + m_min = 0.f; + m_max = 10.f; + + tft.drawFastVLine(m_x+leftMargin-1, m_y, m_height, TFT_WHITE); + + for (auto iter = std::begin(m_labels); iter != std::end(m_labels); iter++) + { + tft.drawFastHLine(m_x+leftMargin-5, float(m_y)+(float(m_height)/(m_labels.size()-1)*std::distance(std::begin(m_labels), iter)), 4, TFT_WHITE); + iter->start(); + } + + render(buffers, false); +} + +template +void Graph::redraw(const std::array>, COUNT> &buffers) +{ + render(buffers, true); +} + +template +void Graph::render(const std::array>, COUNT> &buffers, bool delta) +{ + float min, max; + bool first{true}; + for (const ring_buffer &buffer : buffers) + { + auto minmax = std::minmax_element(std::cbegin(buffer), std::cend(buffer)); + + if (first || *minmax.first < min) + min = *minmax.first; + if (first || *minmax.second > max) + max = *minmax.second; + first = false; + } + + if (min < m_min) + m_min = min*0.9f; + else if (min > m_min*1.1f) + m_min = min*1.1f; + + if (max > m_max) + m_max = max*1.1f; + else if (max < m_max*0.9f) + m_max = max*1.1f; + + if (m_max-m_min < 2.f) + { + m_min-=1.f; + m_max+=1.f; + } + + if (m_min > 0 && m_max > 0) + m_min = 0; + if (m_min < 0 && m_max < 0) + m_max = 0; + + tft.setTextFont(2); + tft.setTextColor(TFT_WHITE, TFT_BLACK); + for (auto iter = std::begin(m_labels); iter != std::end(m_labels); iter++) + iter->redraw(String(int(m_max+((m_min-m_max)/(m_labels.size()-1)*std::distance(std::begin(m_labels), iter))))); + + int x{leftMargin}; + for (auto pixelsIter = std::begin(m_lastPixels); pixelsIter!=std::end(m_lastPixels); pixelsIter++) + { + const auto index0 = std::distance(std::begin(m_lastPixels), pixelsIter); + auto &pixels = *pixelsIter; + + for (auto iter = std::begin(pixels); iter != std::end(pixels); iter++) + { + const auto index1 = std::distance(std::begin(pixels), iter); + + const std::reference_wrapper> &ref = *(std::begin(buffers)+index1); + const ring_buffer &buffer = ref.get(); + + const float &val = *(std::begin(buffer)+index0); + + int y = scaleBetween(val, m_min, m_max, m_y+m_height-1, m_y+1); + if (!delta || *iter != y) + { + if (delta) + tft.drawFastVLine(x, *iter-1, 3, TFT_BLACK); + tft.drawFastVLine(x, y-1, 3, TFT_WHITE); + *iter = y; + } + } + + x++; + } +} +} diff --git a/src/widgets/label.h b/src/widgets/label.h new file mode 100644 index 0000000..fea7edb --- /dev/null +++ b/src/widgets/label.h @@ -0,0 +1,78 @@ +#pragma once + +#include + +#include "globals.h" + +namespace { +class Label +{ +public: + Label(int x, int y) : m_x{x}, m_y{y} {} + + int x() const { return m_x; }; + int y() const { return m_y; }; + + void start(); + void redraw(const String &str, bool forceRedraw = false); + void clear(); + +private: + const int m_x; + const int m_y; + + String m_lastStr; + int m_lastFont; + int m_lastColor; + + int m_lastWidth; + int m_lastHeight; +}; + +void Label::start() +{ + m_lastStr.clear(); + m_lastFont = -1; + m_lastColor = -1; + + m_lastWidth = 0; + m_lastHeight = 0; +} + +void Label::redraw(const String &str, bool forceRedraw) +{ + if (m_lastStr == str && + m_lastFont == tft.textfont && + m_lastColor == tft.textcolor && + !forceRedraw) + return; + + const auto renderedWidth = tft.drawString(str, m_x, m_y); + const auto renderedHeight = tft.fontHeight(); + + if (renderedWidth < m_lastWidth) + tft.fillRect(m_x + renderedWidth, m_y, + m_lastWidth - renderedWidth, m_lastHeight, + tft.textbgcolor); + + if (renderedHeight < m_lastHeight) + tft.fillRect(m_x, m_y + renderedHeight, + renderedWidth, m_lastHeight - renderedHeight, + tft.textbgcolor); + + m_lastStr = str; + m_lastFont = tft.textfont; + m_lastColor = tft.textcolor; + + m_lastWidth = renderedWidth; + m_lastHeight = renderedHeight; +} + +void Label::clear() +{ + if (m_lastWidth || m_lastHeight) + tft.fillRect(m_x, m_y, m_lastWidth, m_lastHeight, TFT_BLACK); + + start(); +} +} diff --git a/src/widgets/progressbar.h b/src/widgets/progressbar.h new file mode 100644 index 0000000..24a2f90 --- /dev/null +++ b/src/widgets/progressbar.h @@ -0,0 +1,46 @@ +#pragma once + +#include "globals.h" +#include "utils.h" + +namespace { +class ProgressBar +{ +public: + ProgressBar(int x, int y, int width, int height, int min, int max, uint32_t color=TFT_YELLOW) : + m_x{x}, m_y{y}, m_width{width}, m_height{height}, m_min{min}, m_max{max}, m_color{color} + {} + + void start(); + void redraw(int value); + +private: + const int m_x; + const int m_y; + const int m_width; + const int m_height; + const int m_min; + const int m_max; + const uint32_t m_color; + + int m_lastValue{m_x+1}; +}; + +void ProgressBar::start() +{ + tft.drawRect(m_x, m_y, m_width, m_height, TFT_WHITE); +} + +void ProgressBar::redraw(int value) +{ + value = scaleBetween(value, m_min, m_max, m_x+1, m_x+m_width-1); + + if (value < m_lastValue) + tft.fillRect(value, m_y+1, m_lastValue-value, m_height-2, TFT_BLACK); + else if (value > m_lastValue) + tft.fillRect(m_lastValue, m_y+1, value-m_lastValue, m_height-2, m_color); + + m_lastValue = value; +} + +} diff --git a/test/README b/test/README new file mode 100644 index 0000000..df5066e --- /dev/null +++ b/test/README @@ -0,0 +1,11 @@ + +This directory is intended for PIO Unit Testing and project tests. + +Unit Testing is a software testing method by which individual units of +source code, sets of one or more MCU program modules together with associated +control data, usage procedures, and operating procedures, are tested to +determine whether they are fit for use. Unit testing finds problems early +in the development cycle. + +More information about PIO Unit Testing: +- https://docs.platformio.org/page/plus/unit-testing.html